基于ffmpeg的音频转码
首先引入音频帧的概念:
ffmpeg音频转码:
由于不同格式音频帧数的不同,在使用ffmpeg作音频转码时需要作音频fifo来缓存解码数据,依据编码音频帧需要给对应的大小。
音频fifo可使用ffmpeg中已写好的fifo,定义在libavutil/audio_fifo.h下。
AVAudioFifo,SwrContext定义及初始化:
![](https://code.csdn.net/assets/CODE_ico.png)
- AVAudioFifo *af = NULL;
- SwrContext *resample_context = NULL;
- long long pts = 0;
- for(int i=0; i<1; i++){
- printf(" samplerate input = %d , samplerate output = %d\n",pAudioCodecCtx[i]->sample_rate, AudioEncodeCtx[i]->sample_rate);
- resample_context = swr_alloc_set_opts(NULL, av_get_default_channel_layout(AudioEncodeCtx[i]->channels),
- AudioEncodeCtx[i]->sample_fmt,
- AudioEncodeCtx[i]->sample_rate,
- av_get_default_channel_layout(pAudioCodecCtx[i]->channels),
- pAudioCodecCtx[i]->sample_fmt,
- pAudioCodecCtx[i]->sample_rate,
- 0, NULL);
- swr_init(resample_context);
- }
- af = av_audio_fifo_alloc(AudioEncodeCtx[0]->sample_fmt, AudioEncodeCtx[0]->channels, 1);
- if(af == NULL)
- {
- printf("error af \n");
- return -1;
- }
转码过程:
![](https://code.csdn.net/assets/CODE_ico.png)
- if (avcodec_decode_audio4(pAudioCodecCtx[i], pAudioframe[i], &frame_size, &pkt) >= 0) {
- if (i == 0){
- uint8_t *converted_input_samples = NULL;
- converted_input_samples = (uint8_t *)calloc(AudioEncodeCtx[i]->channels, sizeof(*converted_input_samples));
- av_samples_alloc(&converted_input_samples, NULL, AudioEncodeCtx[i]->channels, pAudioframe[i]->nb_samples, AudioEncodeCtx[i]->sample_fmt, 0);
- int error = 0;
- if((error = swr_convert(resample_context, &converted_input_samples, pAudioframe[i]->nb_samples,
- (const uint8_t**)pAudioframe[i]->extended_data, pAudioframe[i]->nb_samples))<0){
- printf("error : %d\n",error);
- }
- av_audio_fifo_write(af, (void **)&converted_input_samples, pAudioframe[i]->nb_samples);
- int got_frame=0;
- //Encode
- while(av_audio_fifo_size(af) >= AudioEncodeCtx[i]->frame_size){
- int frame_size = FFMIN(av_audio_fifo_size(af),AudioEncodeCtx[i]->frame_size);
- pOutAudioframe[i]->nb_samples = frame_size;
- pOutAudioframe[i]->channel_layout = AudioEncodeCtx[i]->channel_layout;
- pOutAudioframe[i]->sample_rate = AudioEncodeCtx[i]->sample_rate;
- pOutAudioframe[i]->format = AudioEncodeCtx[i]->sample_fmt;
- av_frame_get_buffer(pOutAudioframe[i], 0);
- av_audio_fifo_read(af, (void **)&pOutAudioframe[i]->data, frame_size);
- pOutAudioframe[i]->pts=pts;
- pts += pOutAudioframe[i]->nb_samples;
- audio_pkt.data = NULL;
- audio_pkt.size = 0;
- av_init_packet(&audio_pkt);
- avcodec_encode_audio2(AudioEncodeCtx[i], &audio_pkt, pOutAudioframe[i], &got_frame);
- }
- }
- break;
- }
![](http://static.blog.csdn.net/images/save_snippets.png)
基于ffmpeg的音频转码相关推荐
- 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译
Hello FFMPEG 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编 ...
- 最简单的基于FFMPEG的音频编码器(PCM编码为AAC)
本文介绍一个最简单的基于FFMPEG的音频编码器.该编码器实现了PCM音频采样数据编码为AAC的压缩编码数据.编码器代码十分简单,但是每一行代码都很重要.通过看本编码器的源代码,可以了解FFMPEG音 ...
- 基于 FFMPEG 的音频编解码(三):音频编码
音频编码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在前面文章中 ...
- 基于 FFMPEG 的音频编解码(二):音频解码
音频解码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在 Hell ...
- Qt基于FFmpeg实现视频转码
一.简述转码 转码的作用:封装格式的实现.(h264->mov.mp4.flv.avi(封装格式)等) 之前博客中提到如何把像素数据编码得到 H264 的压缩码流数据,但是一般的播放工具是没法直 ...
- android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...
android 端基于 FFmpeg 库的使用 添加编译 ffmpeg.shine.mp3lame.x264 源码的参考脚本 目前音视频相关处理: 音频剪切.拼接 音频混音 音频转码 音视频合成 音频 ...
- 利用ffmpeg进行音频转码
在进行音频转码前,首先需要查看我们原始音频中的编码格式以及一些重要的音频参数,包括:采样率,采样格式,通道类型等. 通过将原始的编码格式,采样率,采样格式,通道类型与目标编码格式,采样率,采样格式,通 ...
- C# 使用 ffmpeg 进行音频转码
先放一下 ffmpeg 的官方文档以及下载地址: 官方文档:http://ffmpeg.org/ffmpeg.html 下载地址:http://ffmpeg.org/download.html 用 f ...
- ffmpeg之音频转码及重采样
最近在用ffmpeg做音频这一块,奈何网上这一块的确少,能找到的有些还不能用.今天算是磕磕绊绊把代码调通了.写篇博客讲讲我的拙见. 之所有把转码和重采样写在一起,因为感觉他们是同一个流程完成的工作.下 ...
最新文章
- 大数据下的电商新打法
- Spring(三)AOP面向切面编程
- python学习笔记day08 文件功能详解
- loadrunner编写脚本常用策略,用以记录,看的懂的拿走,看不懂说明与你有缘无份...
- 用户管理界面开源代码_商城系统开源代码对于企业有利还是有弊?
- 白嫖我常用的 11 个超火的前端必备在线工具,终于有时间上班摸鱼了
- 好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题...
- 在浏览器里使用SAPGUI里的SE80
- pythonpil库过滤图像contour_一秒钟带你走进P图世界-----(python)PIL库的使用
- bouncycastle NoSuchFieldError:xxx 版本冲突
- 【转】在C#中使用SQLite
- 剑指offer面试题[9-3]-矩形覆盖
- Java小白进阶笔记(5)-进阶面向对象
- 计算机二级c语言编译题评分,计算机二级C语言题型和评分标准
- bl wn810a linux驱动下载,BL-LW06-AR/BL-WN810A无线网卡驱动for all【支持所有系统】
- Java多线程+IO流+网络编程+MySQL+JDBC编程实现多人联机版坦克大战
- BELLHOP 关于Actup冲激响应的绘制
- 微信ios版本的两个灰度功能和一些小改变
- 通信原理仿真100例 | 多普勒频移的matlab仿真
- 24的两个好的中文论坛