最近因为需要做一个视频评选功能,需要用到视频处理,因为Sham观看其他视频的时候,发现都是m3u8格式的,于是想着也来m3u8下。
那如何将mp4转换成m3u8呢,百度了下,发现ffmpeg就能搞定,于是着手搞起。
首先是给服务器安装ffmpeg,Sham家里自建的服务器上是用的ubuntu,非常幸运,ubuntu上安装非常简单,执行如下代码就行:
sudo apt install ffmpeg
ffmpeg -version
第一行是安装ffmpeg,第二行是查看ffmpeg版本,来确认是否安装好了;
然后再来个centos的,公司用的服务器是centos的,稍微麻烦点,代码如下:
yum -y install epel-release
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
yum -y install ffmpeg ffmpeg-devel
ffmpeg -version
这个是网上照搬来的,大概意思就是安装源,安装包,最后安装ffmpeg,大概吧,作为一个linux没入门的人来说,解释不清。
好了,既然安装好了ffmpeg,那下面就是使用了,其实转换只要一行代码就行了。
首先来把MP4切片成ts,然后创建m3u8,我目前了解到的m3u8其实就是一个类似于清单,播放器读取后,根据这个清单来按序播放ts视频
ffmpeg -i demo.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls demo.m3u8
其中demo.mp4和demo.m3u8就是原文件和需要转换成的m3u8文件;
-profile:v baseline 大概意思是档次转成基本画质,有四种画质级别,分别是baseline, extended, main, high,从低到高
-level 3.0 大概也是视频画质级别吧,基本上是从1到5,
-start_number 0 表示从0开始
-hls_time 10 标识每10秒切一个
其他不太确定了,就不接着编了
直接在命令行内执行上述代码后,就能生成m3u8文件和对应的ts文件了,记得提前先cd得到demo.mp4的目录
PHP也能执行上述代码,需要用到system()函数,正常这个是被禁掉的,需要到php.ini里去解禁。
Sham写成了一个批量执行的,供参考:
<?php
$videos = array("1.mp4","2.mp4","3.mp4","4.mp4","5.mp4");
foreach($videos as $video){
tom3u8($video);
}
function tom3u8($video){
$name = str_replace('.mp4','',$video); //获取视频文件名
if(!file_exists($name)){ //建立以视频文件名命名的文件夹,用于存放ts和m3u8
mkdir($name,0777);
}
//拼装命令
$str="ffmpeg -i ".$video." -profile:v baseline -level 3.0 -start_number 0 -hls_time 5 -hls_list_size 5 -f hls ".$name."/index.m3u8";
system($str,$res); //通过system函数来执行
echo $res; //打印出结果,正常成功返回0,失败返回1
}
这个适合放到已经上传好的MP4文件里,当然,你可以通过获取当前文件夹清单来直接获取文件数组,Sham懒的去写(主要不熟练),就不放了
下面就是如何将m3u8变回MP4了:
前提是这个m3u8文件已经是一个包含ts清单的文件,建议提前下载下来看下,因为有的m3u8只写了通过分辨率来链接到对应的m3u8,那个才是你需要的。
sudo ffmpeg -i https://xxx.com/index.m3u8 -acodec copy -vcodec copy -absf aac_adtstoasc xxx.mp4
这里的m3u8可以直接是网上的文件,最后的xxx.mp4就是你需要转换成的文件。
在命令终端或ssh里执行,也可以参考上面通过system来执行,然后就只要耐心等待就好了,最终完成后,你就得到MP4文件啦
评论前必须登录!
注册