ffmpeg系列之mp4与ts格式转换

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

1. M3U 协议解析

  M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。

  M3U8是一种常见的流媒体格式,主要以文件列表的形式存在,既支持直播又支持点播,尤其在Android、iOS等平台最为常用。


#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:0#EXT-X-ALLOW-CACHE:YES#EXT-X-TARGETDURATION:3#EXTINF:1.969https://test.com/test0.ts#EXTINF:1.972https://test.com/test1.ts#EXTINF:1.109https://test.com/test2.ts#EXT-X-DISCONTINUITY#EXTINF:2.969https://test.com/test3.ts#EXT-X-ENDLIST

1.1、Tag说明

下面我们说明一下比较常用和关键的几个字段:
  • EXTM3U:这个是M3U8文件必须包含的标签,并且必须在文件的第一行,所有的M3U8文件中必须包含这个标签。
  • EXT-X-VERSION:M3U8文件的版本,常见的是3(目前最高版本应该是7)。
  •EXT-X-TARGETDURATION:该标签指定了单个媒体文件持续时间的最大值,播放文件列表中的媒体文件在EXTINF标签中定义的持续时间必须小于或者等于该标签指定的持续时间。该标签在播放列表文件中必须出现一次。
  •EXT-X-MEDIA-SEQUENCE:M3U8直播是的直播切换序列,当播放打开M3U8时,以这个标签的值作为参考,播放对应的序列号的切片。
  •EXTINF:EXTINF为M3U8列表中每一个分片的duration,如上面例子输出信息中的第一片的duration为2.969秒。在EXTINF标签中,除了duration值,还可以包含可选的描述信息,主要为标注切片信息,使用逗号分隔开。
  •EXT-X-DISCONTINUITY:需要特别说明的就是这个tag了,表示前一片分片和后一片分片有不连续。
  •EXT-X-ENDLIST:若出现EXT-X-ENDLIST标签,则表明M3U8文件不会再产生更多的切片,可以理解为该M3U8已停止更新,并且播放分片到这个标签后结束。M3U8不仅仅是可以作为直播,也可以作为点播存在,在M3U8文件中保存所有切片信息最后使用EXT-X-ENDLIST结尾,这个M3U8即为点播M3U8。EXT-X-ENDLIST标签可能会出现在播放列表文件的任何地方,但是不能出现两次或以上。
  •EXT-X-STREAM-INF:EXT-X-STREAM-INF标签出现在M3U8时,主要是出现在多级M3U8文件中时,例如M3U8中包含子M3U8列表,或者主M3U8中包含多码率M3U8时;该标签后需要跟一些属性,下面就来逐一说明一下这些属性:
    BANDWIDTH:BANDWIDTH的值为最高码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的最大码率(必要参数)。
    AVERAGE-BANDWIDTH:AVERAGE-BANDWIDTH的值为平均码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的平均码率。(可选参数)。
    CODECS:CODECS的值用于声明EXT-X-STREAM-INF下面对应M3U8里面的音视频编码、视频编码的信息(可选参数)。
    RESOLUTION:M3U8中视频的宽高信息描述(可选参数)。
    FRAME-RATE:子M3U8中的视频帧率(可选参数)。
  •#EXT-X-KEY:表示怎么对media segments进行解码。其作用范围是下次该tag出现前的所有media URI,格式如下:
    #EXT-X-KEY::NONE 或者 AES-128。如果是NONE,则URI以及IV属性必须不存在,如果是AES-128(Advanced EncryptionStandard),则URI必须存在,IV可以不存在。
    对于AES-128的情况,keytag和URI属性共同表示了一个key文件,通过URI可以获得这个key,如果没有 IV(Initialization Vector),则使用序列号作为IV进行编解码,将序列号的高位赋到16个字节的buffer中,左边补0;如果 有IV,则将改值当成16个字节的16进制数。
  •#EXT-X-PROGRAM-DATE-TIME:将一个绝对时间或是日期和一个媒体段中的第一个sample相关联,只对下一个meida URI有效,格式如下:
    #EXT-X-PROGRAM-DATE-TIME:YYYY-MM-DDThh:mm:ssZ
    For example:
    #EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00
  •#EXT-X-ALLOW-CACHE:是否允许做cache,这个可以在PlayList文件中任意地方出现,并且最多出现一次,作用效果是所有的媒体段。格式如下:
    #EXT-X-ALLOW-CACHE:<YES|NO>
  •#EXT-X-PLAYLIST-TYPE: 提供关于PlayList的可变性的信息, 这个对整个PlayList文件有效,是可选的,格式如下:
    #EXT-X-PLAYLIST-TYPE:<EVENT|VOD> :如果是VOD,则服务器不能改变PlayList 文件;如果是EVENT,则
服务器不能改变或是删除PlayList文件中的任何部分,但是可以向该文件中增加新的一行内容。

2、HLS 与 M3U8

  HLS(全称:Http Live Streaming)是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。

  HLS的优势为:自适应码率流播(adaptive streaming)。效果就是客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且能够自动在二者之间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。实现方法是服务器端提供多码率视频流,并且在列表文件中注明,播放器根据播放进度和下载速度进行自动调整。

  为什么要用 TS 而不是 MP4?这是因为两个 TS 片段可以无缝拼接独立解码,播放器能连续播放,而 MP4 文件由于编码方式的原因,两段 MP4 不能无缝拼接,播放器连续播放两个 MP4 文件会出现破音和画面间断,影响用户体验。而且如果要在一段长达一小时的视频中跳转,如果使用单个 MP4 格式的视频文件,并且也是用 HTTP 协议,那么需要代理服务器支持 HTTP range request 获取大文件中的一部分。这样的话,对于代理服务器的性能来说要求较高。而 HTTP Live Streaming 则只需要根据列表文件中的时间轴找出对应的 TS 片段下载即可,不需要 range request,对代理服务器的要求小很多。所有代理服务器都支持小文件的高效缓存。

3、通过ffmpeg进行转换

3.1、 mp4格式转换为ts格式

如果是mp4格式,则可以通过ffmpeg转换为ts格式,命令如下所示:


ffmpeg -i output20.mp4 -codec copy  -hls_list_size 0  -hls_wrap 0 -strict -2  -vbsf h264_mp4toannexb -absf aac_adtstoasc -f hls -hls_base_url https://test.com/ test.m3u8

命令参数说明:
  • -hls_time n: 设置每片的长度,默认值为2。单位为秒。即EXTINF tag对应的值。hls_time设置后效果不一定准确,会受到关键帧大小及其他因素影响。如果需要相对非常准确的切片,可以添加hls_flags的子参数split_by_time来保证生成的切片能够与hls_time设置的切片时长差不多。split_by_time参数必须与hls_time配合使用,并且使用split_by_time参数有可能会影响首画面体验,例如花屏或者首画面显示慢的问题,因为视频的第一帧不一定是关键帧。
  • -hls_list_size n:设置播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5。为了解决这个问题,需要指定参数-hls_list_size 0,这样就能包含所有的片段。
  • -hls_wrap n:设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0.这个选项能够避免在磁盘上存储过多的 片,而且能够限制写入磁盘的最多的片的数量。
  • -hls_start_number n:设置播放列表中sequence number的值为number,默认值为0。注意:播放列表的sequence number 对每个segment来说都必须是唯一的,而且它不能和片的文件名(当使用wrap选项时,文件名有可能会重复使用)混淆。
  •h264_mp4toannexb: h264有两种封装,一种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中,vlc里打开编码器信息中显示h264;一种是mp4模式,一般mp4 ,mkv会有,没有startcode,SPS和PPS以及其它信息被封装在container中,每一个frame前面是这个frame的长度,vlc里打开编码器信息中显示avc1。很多解码器只支持annexb这种模式,因此需要将mp4做转换。
  •aac_adtstoasc:将AAC编码器编码后的原始码流(ADTS头 + ES流)封装为MP4或者FLV或者MOV等格式时,需要先将ADTS头转换为MPEG-4 AudioSpecficConfig (将音频相关编解码参数提取出来),并将原始码流中的ADTS头去掉(只剩下ES流);相反,从MP4或者FLV或者MOV等格式文件中解封装出AAC码流(只有ES流)时,需要在解析出的AAC码流前添加ADTS头(含音频相关编解码参数)。
  •hls_base_url 参数用于为M3U8列表的文件路径设置前置基本路径参数,因为在FFmpeg中生成M3U8时写入的TS切片路径默认为M3U8生成的路径相同,但是实际上TS所存储的路径既可以为本地绝对路径,也可以为相对路径,还可以为网络路径,因此使用hls_base_url参数可以达到该效果。

3.2、 ts格式拼接命令


ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4

个人学习笔记,如有错误还请指正,谢谢。

ffmpeg系列之mp4与ts格式转换相关推荐

  1. c++录屏、FFmpeg录屏、录屏格式转换

    需求分析: 需要对软件的客户区进行录屏,但是找了半天资料发现并不好集成到我的软件当中,最后发现利用cmd命令调用ffmpeg.exe可以实现录屏功能,实现录屏以及录屏格式转换,相当有趣. 知识点: 1 ...

  2. python使用ffmpeg库高效免费完成音频格式转换

    在生活中,我们因为种种原因经常需要对音频格式文件进行转换. 使用已经发布的各种音频格式转换软件进行音频格式转换时在没有会员的情况下,最终转换的音频文件在开头或者末尾会有软件植入广告,这就是噪音,此时转 ...

  3. ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战

    注意: VAAPI 是inter gpu 提供的硬编解码接口 VDPAU 是 video decode present api for unix nvdec / ncvid 都是nivida产出的硬解 ...

  4. dicom格式怎么转换_webm怎么转换mp4?视频格式转换你需要知道这个

    WebM是一个开放.免费的媒体文件格式.但不少人更习惯使用mp4,那么webm怎么转换mp4呢? 如何将webm格式转换成mp4呢?别急,小编教你一招轻松转换! 准备: 电脑 风云视频转换器 下载的w ...

  5. 视频如何转格式mp4?视频格式转换mp4格式

    视频如何转格式mp4?qlv视频格式是腾讯视频的独有格式,并且不是一种常规的视频格式,想要观看qlv格式的视频文件,就只能下载腾讯视频播放器,就更别提对qlv视频进行编辑了.接下来小编就带大家一起了解 ...

  6. 使用ffmpeg将mp4格式视频元数据信息转到视频第一帧、转换mp4为ts格式视频

    最近在研究web一些播放器,videojs\ckplayer\jwplayer等各种页面播放器,发现在播放视频的时候,有些mp4格式的视频是不能够边缓存边播放的,在网上查阅了一些资料,发现是这些mp4 ...

  7. ffmpeg实战教程(四)格式转换如MP4转MKV等

    知识延伸: I,P,B帧和PTS,DTS的关系 基本概念: I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过 ...

  8. ffmpeg 常用命令总结:(avi转MP4、MP4转ts、视频压缩、去除视频声音、合并音频和视频)

    文章目录 配置 说明: 0.ffmpeg一些命令参数: a) 通用选项 b) 视频选项 c)高级视频选项 d)音频选项 e)音频/视频捕获选项 f)高级选项 1.avi转MP4命令: 2.MP4转ts ...

  9. ffmpeg 视频格式转换和宽高转换 制作自己想要的数据格式

    ffmpeg 视频格式转换和宽高转换 制作自己想要的数据格式 命令如下: ffmpeg -y -i Titanic.mkv -s 640*480 out.h264 运行效果: 一般的 使用 ffmpe ...

最新文章

  1. hdu 5751 Eades
  2. html js 添加数据类型,js数据类型判断和转换
  3. linux日志本地存储和网络存储,文件系统和本地存储管理 1
  4. mysql 视图 教程_MySQL视图简介及基本操作教程
  5. spring中的class配置不能使用properties中的字符串
  6. NVIDIA控制面板闪退
  7. java操作html和word生成pdf,可生成目录和表格
  8. 记一个用PyPDF2裁剪pdf文件并用latex插入后出现大量空白的问题
  9. Java 简单计算器
  10. 终极解决苹果开发者中心Edit Phone Number
  11. Gartner 发布2022年新兴技术成熟度曲线
  12. spring注解开发配置spring父子容器
  13. NVIDIA Geforce显卡和AMD Radeon系列显卡知识
  14. Data-driven methods for solving algebra word problems论文阅读
  15. Android中的多点触摸
  16. JavaWeb基础系列(八)商城后台增删改查
  17. google的搜索技巧
  18. java原生的编译软件_原生态Java 程序员容易忽视的编程细节
  19. 【C++】map、set、multimap、multiset的介绍和使用
  20. Tableau:如何自定义形状

热门文章

  1. Linux Bootup Time
  2. RGB to HSV
  3. USB学习入门(五)------蓦然回首,那人却在灯火阑珊处
  4. 开发者驱动的软件公司,如何赚取万亿美元?
  5. 锁屏面试题百日百刷-面试必问三次握手
  6. 简单制作截图工具,你也可以
  7. 河北省中考计算机操作试题2019,2019年河北省中考试卷、答案、解析
  8. SWH-1T显微硬度计及图像测量系统
  9. [计算机视觉]入门,光,RGB和HSV转换
  10. 程序员的数学思维修炼(趣味解读)孪生素数