基本概况
利用Android的SurfaceView + JNI + OpenGL + OpenSL +ffmpeg所做的一个本地视频播放器;
其实去年底在学习音视频知识的时候就做完了这个Demo,但一直想找时间改进并且拖着没有记录成博客,最近在复习音视频知识,希望能够把这个项目重新熟悉一下,顺便记录下来
完成功能:
- 解析本地视频音频和视频
- 音视频同步
- 暂停恢复播放
- 支持拖动播放
基本结构:
- MediaPlayerController 负责对外jni接口
- MediaSynchronizer 同步模块
- TextureQueue 内部有队列缓存视频帧,负责存入VideoFrame、转换为TextureFrame和对外提供TextureFrame
- AudioQueue 内部有队列缓存音频帧
- MediaDecoder 音视频解码器
- VideoOutput 视频输出
- AudioQueue 音频输出
前期知识点:
OpenGL、多线程知识、简单的音视频知识
遇到的难点:
- 音视频同步问题
- 音频解码速度和视频解码速度差距很大
- 播放的速度远远小于解码的解码速度
- OpenSL音频播放线程、OpenGL视频渲染线程、ffmpeg解码线程怎么协调,还有先后顺序
- 不同格式视频解码对齐问题,会造成花屏错位问题
源码:
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/6257.html