使用FFmpeg将mp4转m3u8

2,114 阅读2分钟

MP4文件可以转换为流媒体格式进行播放。一种常见的方法是将MP4文件转换为HLS(HTTP Live Streaming)格式

分为以下几个步骤:

  1. 使用工具(如FFmpeg)将MP4文件拆分为多个小的、持续时间较短的视频片段
  2. 创建一个M3U8播放列表文件
  3. 将视频片段和M3U8文件一起上传到支持HLS协议的服务器上

其实还有其他在线分割视频的网站 split-video.com/zh/

将视频每10s分割, 生成的文件名以%03d自动递增

ffmpeg -i origin.mp4 -c:v copy -c:a copy -segment_time 10 -f segment split%03d.mp4

将分割好的文件split001.mp4转换为中间的MPEG-TS格式文件split001.ts

ffmpeg -i split001.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts split001.ts

( 如果报错提示 Codec 'mp3' (86017) is not supported by the bitstream filter 'aac_adtstoasc'. Supported codecs are: aac (86018) , 那是因为mp3音频转换成aac格式音频,格式不支持. 所以不管原来视频中音频是什么编码,视频不动,音频转aac格式,将转好的文件再次转一次呗 )

ffmpeg -i split001.ts -vcodec copy -acodec aac split_001.ts

然后使用concat协议将这些中间文件串联起来生成splitAll.mp4

ffmpeg -i "concat:split_001.ts|split_002.ts" -c copy -bsf:a aac_adtstoasc splitAll.mp4

最后使用segment选项将splitAll.mp4分割成10秒一段的小段TS文件,并生成对应的M3U8播放列表文件playlist.m3u8

ffmpeg -i splitAll.mp4 -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts

上传生成的TS(Transport Stream)例如:output001.ts, 和playlist.m3u8的播放列表文件上传到服务就可以了

如果本地要测试流媒体可以html中引入HLS.js

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>

<video id="video" controls></video>

javascript

document.addEventListener('DOMContentLoaded', function() {
  var video = document.getElementById('video');
  var hls = new Hls();
  
  if (Hls.isSupported()) {
    //加载播放列表文件
    hls.loadSource('path/to/your/playlist.m3u8');
    //将 `video` 元素与Hls实例关联起来
    hls.attachMedia(video);
    //当播放列表解析完毕后执行回调函数
    hls.on(Hls.Events.MANIFEST_PARSED, function() {
      video.play();
    });
  }
});