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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mybatis事务隔离级别「建议收藏」

    Mybatis事务隔离级别「建议收藏」转载:https://blog.csdn.net/qq924862077/article/details/52599961一般数据库的隔离级别有4个,由低到高依次为Readuncommitted、Readcommitted、Repeatableread、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。√:可能出现    ×:不会出现脏读不可重复读幻读说明…

    2022年10月14日
    2
  • 使用std–fstream处理文件「建议收藏」

    使用std–fstream处理文件「建议收藏」fstream文件操作总结文件的操作一直在用,在此总结一下:fstream的使用std::fstream从std::ofstream继承写入文件的功能,从std::ifstream继承读取文件的功能.包含头文件#include使用open()和close()打开和关闭文件#include#includeusingnamespa

    2025年12月7日
    3
  • goland 激活【2021免费激活】

    (goland 激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M…

    2022年3月28日
    69
  • 十字路口的交通灯控制系统_十字路口红绿灯控制程序设计

    十字路口的交通灯控制系统_十字路口红绿灯控制程序设计十字路口交通信号灯控制系统主要任务开发平台设计思路主要任务设计一个用于十字路口的交通灯控制器,能显示十字路口东西、南北两个方向的红、黄、绿的指示状态;具有倒计时的功能,用两组数码管作为东西和南北方向的倒计时显示,**主干道直行(绿灯)60秒后,左转(绿灯)40秒;支干道直行(绿灯)45秒后,左转(绿灯)30秒,**在每次绿灯变成红灯的转换过程中,要亮黄灯5秒作为过渡。黄灯每秒闪亮一次。只考虑直行和左转车辆控制信号灯,右转车辆不受信号灯控制,南北向车辆与东西向车辆交替方向,同方向等待车辆应先方向直

    2022年9月25日
    4
  • 压缩文件密码破解神器rarcrack

    压缩文件密码破解神器rarcrackhttp://hi.baidu.com/sdusoul/item/b11d13ee1181b4225b2d6401采用的是暴力破解,可以指定特定密码,否则暴力破解,很长时间吧要,三位密码100需要2分钟左右,六位密码要一年吧,用mapreduce大概可以快些。

    2022年6月6日
    32
  • matlab直方图绘制[通俗易懂]

    matlab直方图绘制[通俗易懂]x=[55,63,69,70,75,78,82,84,85,88,90,96,100];y=[1,2,1,6,4,7,2,1,3,2,4,2,1];bar(x,y)>>a=[54.5,64.5,74.5,84.5,94.5];>>b=[1,3,17,8,7];>>bar(a,b)barh():可以显示一个水平的条形图barh(a,b)bar3或bar3h:显示三维bar3(a,b)…

    2022年10月18日
    2

发表回复

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

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