视频:
视频播放形式
- 使用网络url播放视频
使用网络url播放视频分为两种情况:
A:流视频:对流形式的视频而言,Android原生的Mediaplayer等播放控件可以实现在线播放功能。
B:非流视频:需要把视频下载到本地,再进行播放,但是这里有个缺陷,不能实现边播边下。 使用本地url播放视频:直接在MediaPlayer或者VideoView放置一个url即可。
视频格式的组成
简要地说,MP4文件主要由ftyp,mdat,moov这三部分组成。
- ftyp 记录了mp4格式,编码格式之类的一些基本信息
- mdat记录了视频媒体信息(mdat的体积往往非常的大,几乎等于MP4总大小)
moov是如同检索表一样的存在,里面记录了每一帧对应的数据在哪里等等
如果moov比较大,播放器需要较多的时间去解析,所以在播放之前可能会出现较长的缓冲时间,特别是视频文件较大的情况下,所以现在有些点播网站会采用每段mdat都有自己独立的metadata的封装方式,这样就可实现渐进式下载和快速缓冲的效果。
视频工作过程
- 读取ftype部分决定解码方式。
- 寻找并读取moov部分,获取视频总时长等信息。
- 根据moov的检索信息到mdat里面读取相应的媒体信息,进而播放。
视频处理
FFmpeg
FFmpeg的是一个自由软件,可以运行音频和视频多种格式的录影,转换,流功能,包含了libavcodec–这是一个用于多个项目中音频和视频的解码器库,以及libavformat- - 一个音频与视频格式转换库。
将moov移动到mdat前面
qt-faststart.exe 原视频文件路径 生成的视频文件路径
如果上面这句话抛出last atom in file was not a moov atom的异常错误
则使用
d:\ffmpeg.exe -i 原视频文件路径 -acodec copy -vcodec copy 生成的视频文件路径
然后在执行第一句话即可
播放框架
github
https://github.com/danikula/AndroidVideoCache
原理
如果想知道源码,可以看我的另一篇文章,对源码进行了讲解。开源视频播放框架学习——AndroidVideoCache
总结一下
使用AndroidVideoCache框架播放,如果想像爱奇艺、优酷那样,下载完一半的视频,我断网之后还能播放,就需要把moov数据放置到mdat前面。
你还可以对这个框架进行优化。优化方案
在视频播放中遇到的问题
我有一个视频在Android5.1播放很流畅,但是放在了Android4.4.2上面就变得很卡,甚至播放了一半,就无法继续播放了,后来发现是视频的编解码的问题。
developer.android.com
我视频编解码是H.264 AVC Main Profile (MP),这个在高版本的Android设备上播放是没有问题的,但是在低版本的设备上播放就会出现我上面说的那种问题。这时候需要转换成为H.264 AVC Baseline Profile (BP)编解码。
我使用的转换工具是——魔影工厂
微信公众号:
QQ群:365473065