用了几天的时间,将ffplay(4.1版本)移植到了iOS平台,并保留了绝大部分功能。
ffplay播放视频和音频用的是SDL库提供的功能,本项目用OpenGL播放视频,用AudioUnit播放音频,可以参考前面的两篇文章:
为了方便,播放视频时只支持YUV420P格式,否则需要进行转换,音频统一转换成2声道、44100采样率、位深16格式。
ffplay多线程操作时用到的锁和信号量是SDL库提供的功能,本项目中用iOS上的NSCondition类替换,NSCondition同时提供了锁和信号量相关操作,SDL_mutex和SDL_cond可以统一用NSCondition替换。
ffplay开辟线程用的也是SDL库提供的功能,本项目中用iOS上的NSThread类替换。
处理事件(键盘/鼠标),ffplay用的是SDL提供的功能,本项目中用iOS上按钮的点击事件代替,只保留了其中的一些事件,包括暂停/继续、退出、逐帧播放、快进、快退、切换音视频流。
过程中遇到的难题:
1.由于引入多线程,稍有不慎,就出错,非常不容易调试:
static int decoder_start(Decoder *d, int (*fn)(void *), void *arg)
{