您的位置:首页 > 其它

FFMPEG录屏软件开发之YUV AAC合成MP4

2017-10-27 20:55 281 查看
我们已经获取到了屏幕的图像和麦克风的声音,现在就将它们合并一个普通的视频文件。

所谓视频,其实就是一种容器,里面以某种固定的格式放置了视频和音频数据(比如我们前面生成的H264和AAC)。

先来感受一下FLV的格式:



也就是说只需要按上面规定的方式把图像和音频数据写入文件,最后生成的文件就是一个FLV视频文件了。

当然上面只是FLV规范中的一小块而已,完整的规范还有几页。。

我们只是想写个视频文件而已,就要去看如此可怕的规范,实在是说不过去啊。。

而且换个别的格式规范又不一样,又是几页的规范,这还看得过来么。。

所以让我去看这些规范,我是拒绝的。

好在FFMPEG已经把一些主流的视频格式都封装好了,只需要直接调用API就可以了。

使用ffmpeg生成视频可以参考ffmpeg自带的例子output-example.c。这个文件是在ffmpeg第一版中的doc/example里面。

点击下载output-example.c



output-example.c使用的都是第一版的API,因此这个文件是无法在2.5.2里面编译通过的。

所以我没有提供完整的工程项目,想运行起来看看效果的,可以自行到ffmpeg官网下载第一版的ffmpeg,参考之前搭建ffmpeg开发环境的方法导入库,然后加上output-example.c的代码编译运行。

output-example.c实现的功能就是凭空造出一个视频文件,完全是无中生有,所以强烈建议初学时按照上面说的方法,运行起来感受一下。

虽然output-example.c里面用了第一版的API,但是整体的思路是值得参考的,只需要简单修改一些API就可以在2.5.2中使用了,因此我们生成视频文件的方式就根据这个例子来改。

首先我们就先来了解下output-example.c的流程:

1.初始化libavcodec库,并注册所有的编解码器和格式。
2.根据文件名来获取输出文件格式
只需要在这里指定文件名,ffmpeg便可以根据后缀名自动识别将要保存的视频格式,前面所说的几页的规范这里只需要一句话就搞定了。。

3.分配一个AVFormatContext
4.添加视频和音频流

这里做的操作其实就是指定了视频编码器和音频编码器的参数:
4000

仔细一看就可以知道这个和之前编码音视频的时候,设置编码参数是一样的。

5.打开音视频编码器

这里执行的操作就是打开编码器和分配一些需要的存储空间了:
6.写入视频头
这一步非常重要,不能漏。

7.写入一帧帧的音视频数据

音视频的pts和dts信息就是这个时候写入的。

8.写视频尾
这一步也很重要,虽然不是所有的视频文件都有尾部信息,但是这一步依然不能漏。

整个output-example.c差不多就是这些内容了,ffmpeg保存生成视频还是比较简单的,以后只需要根据这个例子改下就OK了。

最后附上根据output-example.c修改的例子,实现用YUV和PCM文件合成视频文件。

代码就不做解释了,自行下载查看吧。

记得将工程目录下的in.pcm和in.yuv这2个文件拷贝到Qt的构建目录下:

构建目录就是如下所示的目录:



需要注意的是打开视频编码器和音频编码器的时候,设置的参数需要和输入的yuv和pcm一致;

工程提供的Yuv是176x144的,pcm是16bit,44100HZ,双声道的。

例子工程下载地址:http://download.csdn.net/download/qq214517703/9826315

学习音视频技术欢迎访问 http://blog.yundiantech.com

音视频技术交流讨论欢迎加 QQ群 121376426
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息