使用ffmpeg将MP4视频转换为m3u8格式,使用ffmpeg转码m3u8并播放

本文介绍了m3u8视频格式及其优势,并详细阐述了如何使用ffmpeg将MP4视频转换为m3u8,包括视频切片、解决跨域问题以及使用ckplayer播放m3u8视频的步骤。通过这种方式,可以实现不同设备的流畅播放,同时降低服务器压力。
摘要由CSDN通过智能技术生成

一、什么是m3u8:

M3U8视频格式也是一种M3U,只是它的编码格式是UTF-8格式。M3U用Latin-1字符集编码。M3U8格式特点是带有一个目录信息或文件。

二、为什么使用m3u8:

 随着客户在移动端播放的需求日益强烈,我们的转码软件开始输出mp4格式文件,经过测试,发现优秀的软件压缩mp4跟flv压缩率几乎相差无几,于是我们把输出格式统一为mp4,经过我们软件处理后的mp4文件能实现无缓冲拖拽播放(快进播放),也解决了部分视频文件有声音无画面的问题,赢得了客户的好评。

随着客户的增加,mp4文件播放的弊端也日益凸显,主要集中在两个方面,一是当视频时长比较长的时候,mp4的关键帧元素往往很大,需要加载很长时间才能开始播放,网速不好的情况缓冲加载就要20多秒的时间,客户早已急不可耐。二是当用户打开一个视频播放的时候,浏览器会持续请求下载mp4文件直到下载完成,就算是用户暂停视频播放浏览器也会持续这种下载状态,如果这个视频文件是500M则会请求服务器下载500M文件,是1G则会不停下载1G,给服务器硬盘和宽带造成很大浪费和压力。

于是我们参考优酷土豆等大型视频网站系统的播放文件,发现他们的视频文件都是分段播放的,即把一个大的视频文件按照一定大小或时长把一个视频分为N段播放,这样的优势是打开视频加载速度快,可以达到秒播,另外一个优势是当视频播放第N段的时候,浏览器会下载N+1段,N+2则不会下载,大大缓解了服务器硬盘和宽带压力,可知道高昂的宽带成本才是视频网站的最大压力。这样的视频文件处理方式得到了大量客户的一致好评。

可是很快我们又发现了一个很严重的问题,xml分段列表的视频在IOS上面也是一筹莫展&#x

下面是使用ffmpeg查看视频时间和编码信息并转码ts切成m3u8的示例代码: ```php use think\facade\Filesystem; // 视频文件路径 $videoPath = '/path/to/video.mp4'; // 获取视频时长和编码信息 $cmd = "ffmpeg -i $videoPath 2>&1"; exec($cmd, $output); $duration = 0; $codec = ''; foreach ($output as $line) { if (preg_match('/Duration: ([\d:\.]+),/', $line, $matches)) { $duration = strtotime("1970-01-01 $matches[1] UTC"); } if (preg_match('/Video: (.+?),/', $line, $matches)) { $codec = $matches[1]; } } // 转码ts并切成m3u8 $dirPath = '/path/to/output'; Filesystem::mkdir($dirPath); $outputPath = $dirPath . '/output.m3u8'; $cmd = "ffmpeg -i $videoPath -codec:v $codec -map 0 -f segment -segment_list $outputPath -segment_time 10 $dirPath/%03d.ts"; exec($cmd); ``` 首先,我们使用`ffmpeg`命令获取视频的时长和编码信息。在命令中,`-i`参数表示输入文件,`2>&1`表示将标准错误输出重定向到标准输出。然后通过正则表达式解析输出内容获取时长和编码信息。 接着,我们使用`ffmpeg`命令将视频转码成ts格式,并将其切成长度为10秒的小段。`-codec:v`参数表示选择视频编码器,`-map 0`参数表示将所有流映射到输出,`-f segment`参数表示使用分段输出,`-segment_list`参数表示输出m3u8文件路径,`-segment_time`参数表示每个小段的时长,`%03d.ts`表示小段文件名的格式。 最后,我们使用`Filesystem`组件创建输出目录,然后执行`ffmpeg`命令将视频转码并切成小段,输出m3u8文件和ts小段文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值