最近遇到的需求,在老系统中有部分MP4视频在播放时需要完全加载完才能播放,使得用户体验很差(现在都是边下载边播放模式),造成这种情况的原因是用来描述MP4文件的moov atom元数据被放在MP4文件的末尾,而大部分网络播放器都会去读取这个元数据用以确认视频长度,分辨率等等参数,因此只需要将MP4文件的moov atom元数据移到最前面就行,问题明白了,就能够开始解决了,这里使用的是qt-faststart工具。
qt-faststart能够将处于MP4文件末尾的moov atom元数据转移到最前面,不过由于qt-faststart工具只能处理moov atom元数据位于MP4末尾的文件,所以需要其他工具先将moov atom元数据转移到末尾,这样好统一处理MP4文件,这里使用到了ffmpeg共具。
现在整体思路是将MP4文件通过ffmpeg处理,将moov atom元数据转移至末尾,然后使用qt-faststart工具转移至最前面。
现在以linux环境为例子介绍下实际处理流程。
需要用到的工具:
1.yasm-1.2.0.tar.gz,安装ffmpeg时所需要的,下载地方百度一下就有,就不放了。
2.ffmpeg-3.3.3
直接官网下载压缩包http://www.ffmpeg.org/download.html
SVN
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
3.qt-faststart,因为源代码文件在ffmpeg中有,所以不需要单独下载了。
1.将yasm-1.2.0.tar.gz拷贝至linux服务器中。
2. 解压
tar zxvf yasm-1.2.0.tar.gz
cd yasm-1.2.0
4.配置
./configure
5.编译安装
make
make install
1.将下载的压缩包拷贝至linux服务器。
2.解压
tar -jxvf ffmpeg-3.3.3.tar.bz2
3.配置
./configure --enable-shared --prefix=/usr/local/ffmpeg
prefix就是设置安装位置,一般都默认usr/local下
4.安装
make
make install
编译安装时间会很长,10分钟左右吧,装完以后可以去安装目录下查看。
这时还没有结束,现在使用的话一般会报如下错误:
ffmpeg: error while loading shared libraries: libavfilter.so.1: cannot open shared object file: No such file or directory
需要编辑/etc/ld.so.conf文件加入如下内容
/usr/local/lib
保存退出后执行ldconfig命令。
echo "/usr/local/ffmpeg/lib" >> /etc/ld.so.conf
//注意这里是你前面安装ffmpeg的路径
ldconfig
因为在ffmpeg解压完的文件中存在qt-faststart的源码,所以直接使用,位置在解压路径/tools/qt-faststart.c
进入ffmpeg解压路径执行命令
make tools/qt-faststart
会看到在tools中会出现一个qt-faststart文件(还有一个.c文件)
1.ffmpeg将元数据转移至末尾
cd ffmpeg安装路径/bin;./ffmpeg -i /opt/mp4test.mp4 -acodec copy -vcodec copy /opt/1.mp4
// /opt/mp4test.mp4为原始MP4文件路径,/opt/1.mp4为生成文件的存放路径
2.qt-faststart操作
cd ffmpeg压缩包解压路径/tools;./qt-faststart /opt/1.mp4 /opt/2.mp4
//路径如上解释
可以尝试播放1.MP4和2.MP4,前者需要加载完毕才能播放,后者可以边加载边播放。
在用户&&管理员上传视频文件时在后台处理一下上传的mp4文件即可,我这里的方案是上传完文件后,由页面服务器后台获取到存储在数据库中视频的地址,然后通过远程连接访问视频服务器,对该mp4文件进行如上操作,ffmpeg操作后将原文件删除并记录下文件名&路径,然后qt-faststart再根据记录的文件名&路径生成原始文件的同名文件,然后删除ffmpeg过程生成的临时文件即可。