Skip to content

构建基于ffmpeg的android平台视频播放器 AMPlayer

Published: at 12:00 AM

近日,我带领一个四个人的团队,将ffmpeg移植到了android平台下,并基于此成功开发了一款视频播放器AMPlayer,感受颇多。

撰文总结,哈哈…

从技术和管理两个方便随便侃一下吧。 

ffmpeg是一个跨平台的编码解码库,由C语言写成。它包含的libavcodec是编码解码器,而libavformat则是mux, demux的工具,我们的项目还使用了其中的libswcale,主要用来图像转换。

视频播放的原理是这样的:

首先打开文件,使用libavformat获取视频信息和拆包。视频一般由多个流组成,一般为一个视频流,一个到多个音频流,字幕流,可能还有数据流。我们主要关心音频与视频流。依次获取包后,根据包的属性,将此包扔至音频队列和视频队列。

其次就要解码播放了。在android平台上,音频播放时需要调用audiotrack的,设置完音频的属性,然后完后回调函数。系统在播放声音在需要数据时就会调用回调,回调函数,此时就从音频队列中取出包,解码播放。对于视频来说就稍微麻烦一点,需要自己来刷屏播放。具体来说就是首先从视频队列中取出包,解码后放入一个内存区域,然后设置定时器在一段时间后刷屏。时间到后,我们就调用刷屏函数,将前面解码得到的图像复制到屏幕的内存区域上,完成一帧图像的播放。具体来说在android平台上就是获取Surface对象,锁定该对象,将数据拷贝进该对象,然后解锁,通知系统刷屏。

播放器使用了过滤器模式,视频文件->视频队列和音频队列->视频播放和音频播放。需要特别考虑的是通知刷屏最好在主线程(主消息循环)内完成,因为播放器是个典型的GUI程序,使用MVC模式会让开发简单很多。最后系统应该有五个线程,一个是UI线程(主线程),一个解包线程,一个音频解码播放线程,一个视频解码转换线程,最后一个就是刷屏线程。

做产品,最重要的是稳定性。稳定大于一切。一个随时崩溃的产品,就是一个不可用的产品,一个不可用的产品还不如没有这个产品!

项目是需要管理的,更需要控制的!要主要把握节奏与时间,防止失控状态。因此领导也是一种生产力!好的领导可以事半功倍,坏的领导就不说了…

继续总结中…

走技术路线还是管理路线呢?看看再说吧,O(∩_∩)O哈哈~

reference:

http://dranger.com/ffmpeg/


Previous Post
关于生活的思考
Next Post
杂记