好了,前面两章我们大概知道了ffmpeg就是我们的主角,不过我们好像还不知道那些视频到底是怎么工作的,这一节我们就分析一下视频的结构以及我们用ffmpeg来编解码的具体方法和流程,首先我们来看下面一幅图片。
你只有理解了这幅图才可以真正的理解音视频编码。那我们来分析一下它到底是什么意思
1 最上层的mkv mp4 是我们所能看到的藏在你硬盘角落里的那些可以立即播放的视频。这一层就不多说了。格式很多暂时你可以理解为各种各样的盒子,里面的东西都是 一样的,只是存放的方法不一样,有的是切成同样大小一块一块的,有的是不均等大小的,现阶段影响不大。以后会用上
2 第二层告诉我们一个音视频,其实是由音频+视频组成的。音频可以是aac mp3 等格式,视频可以是h264 mpeg2等格式。他们其实是和视频打包在一起的。我们在播放 音视频的时候,要找到对应的音视频的解码器才行。马上有少年要激动了。。。这么多的解码器我在哪里去找?别急,ffmpeg已经准备好了。你调用就可以。那么有没有 ffmpeg也不包含的解码器呢?答案是肯定的。不过那估计要到20章以后我们才可以看到了
3 第三层,其实是第四层。告诉我们要播放的话必须将音频还原为pcm音源,视频还原为yuv文件。是不是太专业了点?其实你可以这样理解,将音频文件转换成byte类型 的数组,交给音频播放器播放,将画面转换成图片Bitmap什么的进行绘图就行。什么?这么土!!!说好的高大上呢!!!我也没办法少年面对事实,你看到的视频就是 在不停的绘图 而已
4 音视频同步。现在你有了音频文件和视频文件,那么我们怎么播放他们呢?聪明的你一定会选择启动两个线程,一个播放声音,一个播放图像对吧?恩 道理上说得通,但 是似乎有点问题。不用担心会解决的,相信我
接下来就是我们的八股文了,几乎所有的关于ffmpeg的编程都按照这个规矩来,请牢记下面的图片,它非常重要
这个就是音视频编码的重点了,我们以后的讲解全部按照它来,现在简要分析一下各个流程
av_register_all():注册FFmpeg所有编解码器。
avformat_alloc_output_context2():初始化输出码流的AVFormatContext。
avio_open():打开输出文件。
av_new_stream():创建输出码流的AVStream。
avcodec_find_encoder():查找编码器。
avcodec_open2():打开编码器。
avformat_write_header():写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。
avcodec_encode_audio2():编码音频。即将AVFrame(存储PCM采样数据)编码为AVPacket(存储AAC,MP3等格式的码流数据)。
av_write_frame():将编码后的视频码流写入文件。
av_write_trailer():写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。
看了就头痛是不是?简单点说:
0 注册ffmpeg所有的解码器
1 打开视频文件
2 找到对应的编码器(注意音视频 需要分开找)
3 解封存放在AVPack中的音视频数据
4 将音频文件和视频文件送到不同的组件进行播放
5 同步音频和视频
6 各种内存的释放,千万小心,音视频文件一定要释放内存
是不是感觉很难?别急,迄今位置你能找到的代码全是一堆一堆的,在我这里,我会一句一句的说给你你听。下一节我们就开始正式的进入视频的解码阶段。今天请各位先把这两幅图理解理解