一、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 秒,m3u8 文件中默认只保存最新的 5 条片的信息,导致最后播放的时候只能播最后的一小部分(直播的时候特别注意)。
-hls_time n 设置每片的长度,默认值为 2,单位为秒。
-hls_list_size n 设置播放列表保存的最多条目,设置为 0 会保存有所片信息,默认值为5。
-hls_wrap n 设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0。这个选项能够避免在磁盘上存储过多的 片,而且能够限制写入磁盘的最多的片的数量。
-hls_start_number n 设置播放列表中 sequence number 的值为 number,默认值为 0。
注意:播放列表的 sequence number 对每个 segment 来说都必须是唯一的,而且它不能和片的文件名(当使用 wrap 选项时,文件名有可能会重复使用)混淆。

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 指定的媒体片段时长(单位为秒)。

ffmpeg m3u8 与 mp4 相互转换相关推荐

  1. ffmpeg m3u8 转 MP4

    ffmpeg -i 你的m3u8地址 -acodec copy -vcodec copy -f mp4 output.mp4 转载于:https://www.cnblogs.com/xuan52roc ...

  2. m3u8转mp4缓存合并工厂_多线程m3u8下载工具,支持windowsamp;amp;linux;两个羊毛线报...

    m3u8下载工具还是挺多的,很多也是基于ffmpeg,这个也是. 这个命令行下载工具,支持windows和linux 64位系统. 支持多线程,支持设置header[一些m3u8链接可能需要设置hea ...

  3. python实现m3u8转mp4

    python实现m3u8转mp4 需要用到两个版本的ffmpeg,文件及原码请到项目地址自取 https://gitee.com/z2322739526/m3u8 主要解决ts改后缀mp4后无法上传网 ...

  4. python实现m3u8转mp4方法2

    python实现m3u8转mp4方法2 项目地址 https://gitee.com/z2322739526/m3u8/tree/master/new 针对chrono下载器插件保存的ts,下载后文件 ...

  5. 某站视频python抓取: m3u8转mp4

    之前利用python简单爬虫抓过一些图片,最近想到了抓取视频.由于很多地方视频不提供下载.所以觉得有必要学习一下,以备不时之需.备注:这里仅记录碰到的网站视频实例,不保证适用所有情况. 基本概念与思路 ...

  6. ffmpeg系列之mp4与ts格式转换

    ffmpeg系列之mp4与ts格式转换 1. M3U 协议解析 1.1.Tag说明 2.HLS 与 M3U8 3.通过ffmpeg进行转换 3.1. mp4格式转换为ts格式 3.2. ts格式拼接命 ...

  7. selenium+aiohttp+aiofiles+ffmpeg → m3u8

    前言 在获取视频时,有的网站是将完整的视频链接路径放在了 <vedio></vedio> 中,但是如果直接将如 mp4 文件放在网页中进行加载,如果视频由于时长.清晰度等原因致 ...

  8. python调用ffmpeg合并_用ffmpeg命令处理mp4剪切与合并

    1. 剪切: ./ffmpeg -ss 00:00:06 -t 00:00:12 -i input.mp4 -vcodec copy -acodec copy output.mp4 意思是从截取从6秒 ...

  9. m3u8转mp4无损转换的方法和技巧

    为什么要将m3u8格式转换为mp4格式? 因为m3u8格式很多播放器不支持,只能在浏览器在线看,但是在线看有些不方便而且会因为网络卡顿导致播放体验效果不理想,有的m3u8是加密的,使用一些工具下载后也 ...

最新文章

  1. 58同城 Elasticsearch 应用及平台建设实践
  2. FIR数字滤波器设计_窗函数法
  3. ILRuntime_NewbieGuide—入门
  4. OneManager+CloudFlare Workers部署教程
  5. cefpython基础入门
  6. WriteableBitmap 巧学巧用
  7. matlab excel 新建sheet,MATLAB怎么在保存结果的EXCEL里面添加内容?比如把 'sheet1‘ 改成 ‘已知点’ ,在第一行加上 '已知点' ,'x', 'y' 等....
  8. 数据挖掘算法之离散化和二元化
  9. Android开发学习之QQ好友列表的实现
  10. java.lang.ClassCastException: $Proxy8 cannot be cast to org.hihernate.lob.SerialzableClob
  11. MySQL 5.6版本二进制包多实例安装
  12. 配合大脑一天24小时最佳的工作时间表
  13. 锐捷Linux客户端连接校园网
  14. 软件可行性研究报告模板
  15. php sjis,【通译】PHP中文字编码变换时使用SJIS-win而非SJIS,使用eucJP-win而非EUC-JP...
  16. 软件集成测试工作流程指南
  17. python3.8使用aiml总结
  18. java执行bat代码
  19. Linux笔记之Debian 11(bullseye) 配置国内源
  20. qpython 3h和oh_**python中的类和他的成员

热门文章

  1. Epson推AR眼镜:最大亮点就是可接Android手机
  2. 开源工具:5个优秀的音频编辑器
  3. 腾讯地图踩坑记之选点组件
  4. Yuga Labs「高处不胜寒」
  5. Linux 安装rabbitmq
  6. 怎样用苹果手机看html文件在哪里,怎么在电脑上打开苹果手机上的文件?
  7. Java程序员面试笔试宝典答案,基于HTML
  8. C语音:输入两个整数,要求输出其中值较大者。要求用函数来找到大数。
  9. django自动生成问卷表的软件的设计与实现毕业设计源码291138
  10. 老化测试Gsensor失败分析