在视频播放器的开发中,有两个重要的概念——视频Track和音频Track,即视频流和音频流。“流”是个 抽象的词,用来表示“一连串的通过时间来串连的数据元素”。流中的数据元素称为 帧(frames)。 不同的流是由不同的编码器(codec)来编码生成的。编解码器定义 了流中的数据是如何被编码COded和解码DECoded的,因此它的名字叫做CODEC。 常用的编解码器有Divx和MP3等。从流中读出来的数据叫做包(packets),包是一 段数据,它包含了一段可解码成帧的数据,这些帧就是我们要在应用程序处理的东西 (如播放音频帧或视频帧等)。
每个包要么包含了一个完整的视频帧,要么包含了多个音频帧,这一点非常重要。
我们将实现这样一个流程:
1. 从一个.mp4文件中找到视频流并将它找开;
2. 从视频流中读取包到一帧中;
3. 如果未获取到一个完整的帧,跳转到2
4. 把当前获取到的完整帧保存成文件
5. 跳转到2,直到获取到10帧数据。
本节用到的函数主要有
(1) av_register_all():这个函数用于注册所有编解码器等,在旧版本的ffmpeg里面,要在主函数中先调用这个函数,才能使用ffmpeg的其他编解码器等模块功能。但是在新版本的ffmpeg中,不是不需要调用的;
(2) avformat_open_input(&pAVFormatContext, argv[1], NULL, NULL):用于打开视频文件;第一个参数是用于存放相关的文件信息,即ffmpeg打开文件后,会把相关的文件信息(如视频流、音频流的下标)存放到pAVFormatContext这个变量里面。
(3) avformat_find_stream_info(pAV