使用ffmpeg进行mp4与m3u8之间转换

最近因为需要做一个视频评选功能,需要用到视频处理,因为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的目录

2022-02-10 补充 - 转成ts文件时进行加密

为了防止别人太容易的盗取ts文件,所以在转格式时对ts文件进行加密,方法如下:

首先,新建一个.key文件,名字随便起,这里sham命名成key.key,然后在里面写入16个字节的字符串,随便写,如:

thisismp4forsham

然后在这个key同目录下,新建一个.keyinfo文件,名字也是随便起,这里sham命名为key.keyinfo,然后再里面写入:

其中第一行的数据会写入到m3u8文件里,是你最终key.key文件存放的位置路径

第二行的当前key.key文件的路径,如果和.keyinfo不在同一目录,需要写上路径

key.key
key.key

最后是在执行ffmpeg时,加入如下代码即可

-hls_key_info_file key.keyinfo

完整的就是

ffmpeg -i demo.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 10 -hls_key_info_file key.keyinfo -hls_list_size 0 -f hls demo.m3u8

这样,生成m3u8文件是就会在里面添加相应代码,然后ts文件也被加密了,补充结束 


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文件啦

一个在前往码农道路上走走停停的行政文员

  • 22
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ffmpeg是一个开源的跨平台多媒体处理工具,可以实现将MP4视频文件转换M3U8格式。以下是一种常见的使用ffmpeg实现MP4M3U8的方法: 1. 首先,将MP4文件切片成TS格式,创建M3U8清单。可以使用以下命令来实现: ``` 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文件切片成TS格式,并生成一个名为demo.m3u8M3U8清单文件。 2. 如果需要批量执行MP4M3U8操作,可以使用像引用中提供的PHP脚本一样的方法。这个脚本将遍历一个视频文件数组,针对每个视频文件执行MP4M3U8的操作。 3. 如果已经拥有一个包含TS清单的M3U8文件,可以使用以下命令将其转换MP4文件: ``` ffmpeg -i https://xxx.com/index.m3u8 -acodec copy -vcodec copy -absf aac_adtstoasc xxx.mp4 ``` 这个命令将会下载并解析名为index.m3u8M3U8文件,并将其中的TS流合并为一个MP4文件,保存为xxx.mp4。 总结起来,FFmpeg可以通过切片MP4文件并生成M3U8清单文件来实现MP4M3U8的功能。同时,也可以通过解析包含TS清单的M3U8文件来将其转换MP4文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [使用ffmpeg进行mp4m3u8之间转换](https://blog.csdn.net/shamqu/article/details/114042996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值