网页大视频mp4优化转成m3u8方案

一键切片工具

此处内容需要评论回复后(审核通过)方可阅读。

方案一

mp4压缩

  • 本站选用Moo0视频压缩是一款免费的简便的压缩压缩
  • 压缩效果很不错,画面损失度很小,压缩效果很强

  • 压缩完成后效果

    • 原视频mp4格式 大小999MB

    • 压缩完成后仅122MB
  • 观看效果基本没有差距

    • 大概就是1080p-720p吧
    • 本站资源有限不做演示

MP4分割成m3u8+ts文件

一、什么是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上面也是一筹莫展,为了让视频在IOS设备播放还得保留mp4文件给IOS设备播放。于是m3u8播放列表登场了。
  • m3u8是苹果公司开发的一项新型播放格式,这种播放格式支持目前市面的windows、androis、ios设备主流的浏览器,同样的视频文件既可以在flash环境播放,又能在无flash的html5环境播放,它的优势还不止于此,它可以实现多种码率在不同网速下的自动切换,网速好自动切换高清晰度视频,网速慢自动播放低清晰度文件,还可以实现流加密(视频文件本身加密)、分段下载播放、任意时间点拖拽播放、随机视频文件广告插入等等优势,所以最新版的云转码)视频系统仅把m3u8作为唯一的播放格式而放弃了其他格式的输出。

三、安装ffmpeg:

  • 首先下载windows 可用的ffmpeg文件
  • 下载地址:https://ffmpeg.org/download.html
  • 服务器在国外,打不开可以使用本站下载
    此处内容需要评论回复后(审核通过)方可阅读。
  1. 下载后直接解压:
  2. 配置环境变量:

    • 在系统变量的path中添加ffmpeg文件夹中 bin 的路径

    • 配置完成后检测是否配置成功
    • 在CMD中输入 ffmpeg -version,出现如下信息则配置成功

      image-20220303145344931

四、开始转换:

  • 准备Mp4文件
  • 创建一个php文件

    <?php
    
    $v_path = $argv[1]; //切片路径
    $v_name = $argv[2]; //带切片的视频路径名称
    $s = 2; //切片秒  ts 切片必须小于 5MB
    if (empty($v_path) || empty($v_name)) {
        echo "请填写完整参数";
        exit;
    }
    
    if ($v_path == '/' || $v_path == '\\') {
        $v_path = '';
    } else {
        mkFolder($v_path);
        $v_path = $v_path . "/";
    }
    //这是 FFmpeg 处理命令大家自行更改
    exec("ffmpeg -i $v_name -c copy -map 0 -f segment -segment_list " . $v_path . "playlist.m3u8 -segment_time $s " . $v_path . "player%03d.ts");
    
    $m = file_get_contents('./' . $v_path . 'playlist.m3u8');
    
    preg_match_all('/player(.*?)\.ts/', $m, $arr);
    
    
    
    echo "处理完毕" . "\n";
    echo "播放链接为:/" . $v_path . 'play.m3u8';
    
    
    function mkFolder($path) {
        if (!is_readable($path)) {
            is_file($path) or mkdir($path, 0700);
        }
    }
    function file_path($file) {
        if (class_exists('CURLFile')) {
            return $post['file'] = new \CURLFile(realpath($file));
        } else {
            return $post['file'] = '@' . realpath($file);
        }
    }
  • 打开CMD
  • cmd执行命令(如果没有php环境请自行安装环境,只需要脚本环境就可以)
php 文件名.php 保存的路径 视频路径

image-20220303151011382

image-20220303150923646

  • 打开文件夹可以看到一个m3ub文件和多个ts文件

image-20220303151239895

  • 打开m3u8,可以看到多个ts路径

    image-20220303151349242

  • 默认是m3u8文件本地同一个文件夹的路径,可以修改为网络路径

image-20220303151516984

  • 可以把ts文件上传到OSS对象存储服务,服务器只保留m3u8文件
  • 如果不修改成网络路径,必须把m3u8文件和ts文件上传到同一目录

阿里云OSS访问m3u8文件失败,Access-Control-Allow-Origin

访问m3u8文件需设置跨域服务

设置跨域服务一定要勾选Vary:Origin这个选项

image-20220303152134065

说明

文章部分转载和参考

使用ffmpeg将MP4视频转换为m3u8格式 -https://blog.csdn.net/qq_36623327/article/details/83007456

阿里云OSS请求文件跨域问题Access-Control-Allow-Origin -https://blog.csdn.net/micro_hz/article/details/117441926

视频完美切片存储方案 附自动化处理脚本 -https://blog.kieng.cn/1844.html

Last modification:April 2, 2022
如果觉得我的文章对你有用,请随意赞赏