http://www.jidongchen.com/post/2017-04-10-ffmpeg-sdl2.0#toc_0
参考链接
音视频内容
1、文件
1)音频流
2)视频流
+其他二外的流
播放流程:将视频流解码出来逐帧播放与此同时播放声音流,我们需要特别注意的就是视频和音频的同步的问题,视频文件里面包含了足够的信息让我么来进行同步。
SDL (Simple Direct Media Layer)
是C语言跨平台底层库,我们在播放器内实现里主要使用它的图像渲染 以及音频能力
【也就是准备到最后一步需要渲染图像和音频的是会,都是需要经过它的】
- 视频解包线程(decode_thread):这个线程将视频文件进行解包,将视频流和音频流解析成packet,然后分发到视频解码线程和音频解码线程。
- 视频解码线程(video_thread):这个线程进行实际的视频解码操作,将packet解码成实际的AVFrame,然后交给渲染层。
- 音频线程(audio_thread):SDL音频本运行在一个独立线程,我们需要实现相关回调为其提供数据。
*** 前面两个线程都是可以使用FFMpeg来进行处理的,而后面的整个是需要使用SDL来进行处理的;
总结:
播放器实现的思路: 解码、渲染、同步
【使用在ios上的SDK暂时还没有知道在哪里找到,哪位大神找到了告诉我一下】
代码实现的基本过程:
1) 找资源刘: 找到视频、音频流
2)打开资源: 找到视频流和音频流以后我们需要找到对应的解码器并且打开流,做好解码的准备。 (解码准备)
3)配置解码上下文,将packet加入队列: 配置好解码上下文以后,我们开一个线程专门从视频视频文件里面读取packet,我们将读取到的packet分别放到视频packet队列和音频packet队列。
-
解码数据:
(从视频文件拿到的packet需要经过解码才能拿到实际的帧数据AVFrame,我们已经把视频和音频packet分别放到了两个队列。针对视频我需要一个专门进行解码操作,这个线程将解码得到的AVFrame放到一个专门的视频帧队列。播放器主线程从视频帧拿到数据进行渲染。)
5)完成视频帧解码(视频数据——> 帧): 我们已经完成了视频帧的解码,得到了渲染需要的数据。音频的数据解码,我们将在SDL的音频线程进行。现在我们进入数据呈现的实现。
6)SDL 图像渲染
我们在回调里面要做的就是将解码好的数据,按照回调要求的数据量copy到缓冲区就行了。
音频数据解码
音频数据的解码跟视频数据解码方式基本一致。需要注意的是对于视频数据,一个AVPacket解码出对应一个AVFrame。但是这对于音频数据是不一定的,某些AVPacket可能包含多个frame,这里需要特别处理一下。
???
这里还是欠缺了点使用iOS 中的框架实现对应的内容;