ffmpeg m3u8 与 mp4 相互转换

ffmpeg m3u8 与 mp4 相互转换ts 文件的切割 还跟原文件视频的 GOP 大小有关系 也就是两个 I 帧之间的时间间隔 因为任何一个 ts 分片第一帧必须是 I 帧 否则无法最快播放 并且第一帧不是 I 帧 对于播放器也是没有任何的意义 直接被播放器扔掉 默认的每片长度为 2 秒 m3u8 文件中默认只保存最新的 5 条片的信息 导致最后播放的时候只能播最后的一小部分 直播的时候特别注意 当媒体流正在播放时 客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源 允许流媒体会话适应不同的数据速率

一、m3u8(ts) 合并为 MP4

远程文件

ffmpeg -i "https://xushanxiang.com/demo/ffmpeg/hls265/output.m3u8" -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4 

本地文件

1、通过 copy 命令合并文件

# 合并成 ts 文件  copy /b  F:\f\*.ts  E:\f\new.ts #合并成 MP4 文件 copy /b  F:\f\*.ts  E:\f\new.MP4

2. 通过 ffmpeg 命令如下:

# 未验证 ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,https,crypto,tcp" -i D:/01_doc/mp4/test/index.m3u8 -c copy D:/01_doc/mp4/test/out.mp4 #直接转 ffmpeg -i new.ts -c copy -map 0:v -map 0:a output.mp4 #指定音频流(一般用这个) ffmpeg -i new.ts -c copy -map 0:v -map 0:a -bsf:a aac_adtstoasc output.mp4 #重编码视频 ffmpeg -y -i new.ts -c:v libx264 -c:a copy -bsf:a aac_adtstoasc output.mp4

二、MP4 转 M3U8

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。”M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。

简单来说,m3u8是一个视频格式,就是将一个视频分成很多的小部分,这样方便视频的加载。

1、操作简单,但效率低

ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 2 -hls_time 15 output.m3u8 

生成的效果是:

将 input.mp4 视频文件每 15 秒生成一个 ts 文件,最后生成一个 m3u8 文件,m3u8 文件是 ts 的索引文件。

我们直接用 VLC media player 等播放软件是可以直接打开 m3u8 文件,像播放 mp4 一样。

2、效率优化版,提升效率

TS 文件是一种媒体的扩展名,它是日本高清摄像机拍摄下进行的封装格式。MPEG2-TS(Transport Stream“传输流”;又称TS、TP、MPEG-TS 或 M2T)是用于音效、图像与数据的通信协定,最早应用于DVD的实时传送节目。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。

# 视频整体转码ts ffmpeg -y -i music.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb out\music.ts # ts 文件切片 ffmpeg -i music.ts -c copy -map 0 -f segment -segment_list out\music.m3u8 -segment_time 10 out\15s_%3d.ts 

3、hls_time 切片时间不准确的问题

播放 m3u8 的 ts 切片,必须要完整的下载一个 ts 切片,才能够播放,设置hls_time 的时间间隔越短越好( 根据实际情况来 ),实际过程中设置切片时间间隔为 2 秒,调用如下指令:

ffmpeg -i test.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 2 index.m3u8

但没有按照参数输入,进行切片。

原因:

ts 文件的切割,还跟原文件视频的 GOP 大小有关系(也就是两个 I 帧之间的时间间隔),因为任何一个 ts 分片第一帧必须是I帧,否则无法最快播放,并且第一帧不是 I 帧,对于播放器也是没有任何的意义,直接被播放器扔掉。任何一个视频流必须在获取到第一个I帧才能成功解码出图片。虽然指定了 1 秒切割一个 ts 文件,实际上,由于原视频流可能好几秒才有一个 I 帧,所以必须等到下一个 I 帧,才会重新开始切片。

解决:

既然知道要1秒产生一个ts分片,那就必须产生切片的过程中,强制一秒中产生一个关键帧。

设置关键帧间隔,设置间隔为 2 秒的参数如下:-force_key_frames "expr:gte(t,n_forced*2)

完整指令如:

ffmpeg -i test.mp4 -force_key_frames "expr:gte(t,n_forced*2)" -strict -2 -c:a aac -c:v libx264 -hls_time 2 -f hls index.m3u8

4、m3u8 格式解析

完整的 m3u8 文件有三部分:

  • index.m3u8,保存视频的基本信息和分段文件顺序;
  • key,如果视频加密,保存密钥;
  • data文件,其他都是视频的数据文件。

具体内容解析:

  • #EXTM3U,是文件开始
  • #EXT-X-VERSION,标识HLS的协议版本号;
  • #EXT-X-TARGETDURATION,表示每个视频分段最大的时长(单位秒);
  • #EXT-X-MEDIA-SEQUENCE,表示播放列表第一个 URL 片段文件的序列号;
  • #EXT-X-PLAYLIST-TYPE,表明流媒体类型;
  • #EXT-X-KEY,加密方式,这里加密方式为AES-128,同时指定IV,在解密时需要;
  • #EXTINF,表示其后 URL 指定的媒体片段时长(单位为秒)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231933.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【《重构 改善既有代码的设计》学习笔记2】重构原则

    【《重构 改善既有代码的设计》学习笔记2】重构原则本篇文章的内容来自《重构 改善既有代码的设计》一书学习笔记整理并且加上自己的浅显的思考总结!上一篇通过一个简单的例子体验了一把重构过程,现在我们需要回过头看一下重构的一些背景、原理和理论。 并思考一下重构的关键原则是什么,以及重构时需要考虑哪一些问题?一、什么是重构1、 重构的定义“重构” 这个词有两种不同的定义!名称形式重…

    2022年2月27日
    44
  • ps后期调色教程,ps怎么后期调色步骤图「建议收藏」

    ps后期调色教程,ps怎么后期调色步骤图「建议收藏」欢迎来到易夏岚UI设计之Photoshop系列教学课程,今天我们来学习ps后期调色教程,ps怎么后期调色步骤图。在平时修图的过程中,我们常常会遇到修完图以后觉得色彩还是有些不搭配,使得整个图片看起来效果都不是特别好,那么如何使用ps来进行后期的调色呢?今天我们就一起来看一下吧!先附上原图和做完后期的成片,左为原图,右为调色后。这类小清新的照片的后期思路有一个大的方向,用术语来说就是往高调片走,通俗来说就是明度较高(较亮)的片子。在直方图上的一般表现是这样的:大量的照片信息集中在直方图的…

    2022年6月18日
    18
  • ES6(简易版) Set,Map 数据结构,(for in) (for of) 区别「建议收藏」

    ES6(简易版) Set,Map 数据结构,(for in) (for of) 区别

    2022年3月12日
    66
  • 20分钟计算机网络试讲ppt,基因突变(15-20分钟试讲).ppt

    20分钟计算机网络试讲ppt,基因突变(15-20分钟试讲).ppt文档介绍 问题探讨三位同学在抄写英语句子 THECATSATONT 猫坐在草席上 时 分别抄成了以下的句子 THEHATSATONT 讨论 1 与原来的句子相比较 意思发生了什么变化呢 2 假如在 DNA 分子的复制过程中 发生了类似的错误 DNA 分子所携带的遗传信息将会发生怎样的变化 这样的变化可能对生物体产生什么影响

    2025年6月27日
    4
  • 微型计算机的字节取决于什么的宽度,计算机字长取决于什么的长度[通俗易懂]

    微型计算机的字节取决于什么的宽度,计算机字长取决于什么的长度[通俗易懂]满意答案ajpno2013.03.28采纳率:44%等级:12已帮助:10279人计算机的字长取决于数据总线的宽度.字长是指计算机内部参与运算的数的位数。它决定着计算机内部寄存器、ALU和数据总线的位数,直接影响着机器的硬件规模和造价。字长直接反映了一台计算机的计算精度,为适应不同的要求及协调运算精度和硬件造价间的关系,大多数计算机均支持变字长运算,即机内可实现半字长、全字长(或单字长)和…

    2022年6月28日
    51
  • Android中进行流量统计「建议收藏」

    Android中进行流量统计

    2022年1月28日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号