实现MP4文件边下载边播放

聂季同
2023-12-01

最近遇到的需求,在老系统中有部分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中有,所以不需要单独下载了。

首先安装yasm

1.将yasm-1.2.0.tar.gz拷贝至linux服务器中。
2. 解压

tar zxvf yasm-1.2.0.tar.gz
  1. 进入解压文件
cd yasm-1.2.0

4.配置

./configure

5.编译安装

make
make install

安装完毕后开始安装ffmpeg

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

安装qt-faststart

因为在ffmpeg解压完的文件中存在qt-faststart的源码,所以直接使用,位置在解压路径/tools/qt-faststart.c
进入ffmpeg解压路径执行命令

make tools/qt-faststart 

会看到在tools中会出现一个qt-faststart文件(还有一个.c文件)

对MP4进行操作

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过程生成的临时文件即可。

 类似资料: