首页 > 其他分享 >FFmpeg开发笔记(三十七)分析SRS对HLS协议里TS包的插帧操作

FFmpeg开发笔记(三十七)分析SRS对HLS协议里TS包的插帧操作

时间:2024-07-13 15:08:45浏览次数:10  
标签:write FFmpeg SPS HLS TS ret PPS 分片

​《FFmpeg开发实战:从零基础到短视频上线》一书的“2.1.2  音视频文件的封装格式”介绍了视频流的PS格式和TS格式。由于TS包的长度固定,从TS流的任一片段开始都能独立解码,因此可以把TS当成音视频文件的封装格式。

鉴于TS包的独立解码特性,HLS协议引入了TS格式作为传输单元。HLS协议的实现原理是对一个大的媒体分片,并将分片后的文件路径记录于m3u8文件,客户端依据该m3u8文件即可获取对应的分片列表,再依次播放分片内容。每个TS分片都以SPS与PPS等配置帧开头,其中指定了视频的规格信息及其编码参数,因此每个TS片段都能正常解析播放。关于SPS与PPS的详细说明参见之前的文章《解析H.264码流中的SPS帧和PPS帧》。
上述的分片文件便是一个个以TS格式封装的视频资源,那么当直播源来自一个MP4文件的时候,流媒体服务器又是怎么把MP4文件转化为一个个TS分片的呢?
以SRS为例,它在组装TS包时做了特殊处理,在每个TS包的开头位置,就自动插入SPS与PPS等配置帧。具体代码在SRS框架的trunk/src/main/srs_main_ingest_hls.cpp,查看该源码的SrsIngestHlsOutput::on_ts_video函数,找到以下的代码片段,可见程序在写入H.264流时,先写入SPS帧和PPS帧,再写入I帧、P帧和B帧。

if ((ret = write_h264_sps_pps(dts, pts)) != ERROR_SUCCESS) {
    return ret;
}

if ((ret = write_h264_ipb_frame(ibps, frame_type, dts, pts)) != ERROR_SUCCESS) {
    // drop the ts message.
    if (ret == ERROR_H264_DROP_BEFORE_SPS_PPS) {
        return ERROR_SUCCESS;
    }
    return ret;
}

找到write_h264_sps_pps函数的定义代码如下,发现函数内部在封装序列头时依次输入了SPS帧和PPS帧:

// h264 raw to h264 packet.
std::string sh;
if ((err = avc->mux_sequence_header(h264_sps, h264_pps, sh)) != srs_success) {
    // TODO: FIXME: Use error
    ret = srs_error_code(err);
    srs_freep(err);
    return ret;
}

进一步跟踪mux_sequence_header的定义来源,详细的定义代码在SRS框架的trunk/src/protocol/srs_protocol_raw_avc.cpp,查看该源码的SrsRawH264Stream::mux_sequence_header函数,找到以下的代码片段,可见程序依据ISO_IEC_14496-15的文档规范,先后写入了sequenceParameterSet的NAL单元(即SPS帧),以及pictureParameterSet的NAL单元(即PPS帧)。

// sps
if (true) {
    // 5.3.4.2.1 Syntax, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16
    // numOfSequenceParameterSets, always 1
    stream.write_1bytes(uint8_t(0xe0 | 0x01));
    // sequenceParameterSetLength
    stream.write_2bytes((int16_t)sps.length());
    // sequenceParameterSetNALUnit
    stream.write_string(sps);
}

// pps
if (true) {
    // 5.3.4.2.1 Syntax, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16
    // numOfPictureParameterSets, always 1
    stream.write_1bytes(0x01);
    // pictureParameterSetLength
    stream.write_2bytes((int16_t)pps.length());
    // pictureParameterSetNALUnit
    stream.write_string(pps);
}

由此可见,SRS在每个TS包头都写入了SPS帧和PPS帧,确保TS包是拥有SPS和PPS的完整H.264分片。只有加上SPS与PPS,客户端才能正常拉流解析数据,才能正常渲染视频画面。 
更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

 


标签:write,FFmpeg,SPS,HLS,TS,ret,PPS,分片
From: https://www.cnblogs.com/aqi00/p/18288623

相关文章

  • 可视化课设总结(星巴克网页爬取信息,百度地图网页版爬取信息,百度地图api,pyecharts库,pyth
    一、引言       本博客是本人是基于本人可视化课设所做的总结,其中有些过程的实现可能并不是最优的实现方法,有些实现效果也因为本人的实力有限,并不能达到预期的效果,所以也欢迎大家指点和改良。(刚考完期末回家,终于有时间把这个课设写个博客了,虽然这课设是明天截至的,我今......
  • props与emits
    在Vue3中,父子组件之间的数据传递是一个常见的需求。本文将介绍如何在Vue3中传递对象,并且在子组件中访问和修改父组件对象中的属性值,以及子组件如何调用父组件中的方法。在Vue3中,父子组件之间传值有以下作用:1.组件通信:父组件可以通过向子组件传递数据来实现与子组件的......
  • E. Tracking Segments
    链接https://codeforces.com/problemset/problem/1843/E题面思路二分加树状数组。关键点在于看出来单点修改和区间查询,然后离线+二分:令l=1(1次操作),r=q(最多q次操作)。二分判断能不能行。以及树状数组的板子要记得。代码#define_CRT_SECURE_NO_WARNINGS#include<iostream>......
  • FastStone Capture v9.2 汉化版
    软件简介FastStoneCapture是一款出色的屏幕截图(捕捉)软件,它集图像捕捉、浏览、编辑、视频录制等功能于一身,功能完善、使用方便,值得推荐!软件提供多种截图方式(如:活动窗口、窗口/对象、矩形区域、手绘区域、整个屏幕、滚动窗口等),还具备屏幕录像机、放大镜、颜色拾取、屏幕标尺......
  • FastStone Capture (屏幕截图) v9.2 汉化版
    下载地址:https://www.mediafire.com/file/b6crzq480nyzf8v/FSCapture-9.2-CN.zip/file软件简介:FastStoneCapture是一款出色的屏幕截图(捕捉)软件,它集图像捕捉、浏览、编辑、视频录制等功能于一身,功能完善、使用方便,值得推荐!软件提供多种截图方式(如:活动窗口、窗口/对象、矩形区......
  • BootStrap TreeView示例
    <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><title></title>......
  • Bootstrap图片样式使用方法
    在Bootstrap中自带了几种图片样式,能够让你很快地对其进行使用,这几种样式使用起来相当简单,让我们一起来看看怎么快速调用Bootstrap图片样式。 Bootstrap图片圆角样式在现今的网站建设中,由于扁平化设计的趋势,我们经常会用用到一些CSS3的特性,例如圆角、渐变、阴影等。同样我们也......
  • JS组件系列——BootstrapTable 行内编辑解决方案:x-editable
    转载:http://www.cnblogs.com/landeanfen/p/5821192.html#_label2  阅读目录一、x-editable组件介绍二、bootstrapTable行内编辑初始方案三、bootstrapTable行内编辑最终方案1、文本框2、时间选择框3、下拉框4、复选框5、“阴魂不散”的select2四、总结 正......
  • bootstrap-datetimepicker 项目
    项目 此项目是bootstrap-datetimepicker项目 的一个分支,原项目不支持 Time 选择。其它部分也进行了改进、增强,例如load 过程增加了对ISO-8601日期格式的支持。文档是拷贝/粘贴字原项目的文档,并且加入了更多细节说明。 别犹豫了,下载下来试试吧!下载ZIP包此地......
  • saltStack自动化工具
    目录SaltStack自动化工具核心概念1.Master和Minion2.State3.Pillar4.Grains5.Modules6.Runner7.Reactor工作流程安装和配置1.配置hosts解析2.配置yum源3.saltstack安装3.1master节点3.2minion节点4.配置saltstack4.1master节点配置4.2配置minion节点5.接受认证......