当前位置: 首页 > news >正文

音视频入门基础:MPEG2-TS专题(26)——通过FFmpeg命令使用RTP发送TS流

=================================================================

音视频入门基础:MPEG2-TS专题系列文章:

音视频入门基础:MPEG2-TS专题(1)——MPEG2-TS官方文档下载

音视频入门基础:MPEG2-TS专题(2)——使用FFmpeg命令生成ts文件

音视频入门基础:MPEG2-TS专题(3)——TS Header简介

音视频入门基础:MPEG2-TS专题(4)——使用工具分析MPEG2-TS传输流

音视频入门基础:MPEG2-TS专题(5)——FFmpeg源码中,判断某文件是否为TS文件的实现

音视频入门基础:MPEG2-TS专题(6)——FFmpeg源码中,获取MPEG2-TS传输流每个transport packet长度的实现

音视频入门基础:MPEG2-TS专题(7)——FFmpeg源码中,读取出一个transport packet数据的实现

音视频入门基础:MPEG2-TS专题(8)——TS Header中的适配域

音视频入门基础:MPEG2-TS专题(9)——FFmpeg源码中,解码TS Header的实现

音视频入门基础:MPEG2-TS专题(10)——PSI、SI简介

音视频入门基础:MPEG2-TS专题(11)—— TS中的Section

音视频入门基础:MPEG2-TS专题(12)—— FFmpeg源码中,把各个transport packet组合成一个Section的实现

音视频入门基础:MPEG2-TS专题(13)——FFmpeg源码中,解析Section Header的实现

音视频入门基础:MPEG2-TS专题(14)——PAT简介

音视频入门基础:MPEG2-TS专题(15)——FFmpeg源码中,解析Program association section的实现

音视频入门基础:MPEG2-TS专题(16)——PMT简介

音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现

音视频入门基础:MPEG2-TS专题(18)——PES流简介

音视频入门基础:MPEG2-TS专题(19)——FFmpeg源码中,解析TS流中的PES流的实现

音视频入门基础:MPEG2-TS专题(20)——ES流简介

音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现

音视频入门基础:MPEG2-TS专题(22)——FFmpeg源码中,获取TS流的音频信息的实现

音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息

音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现

音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流

音视频入门基础:MPEG2-TS专题(26)——通过FFmpeg命令使用RTP发送TS流

=================================================================

一、通过FFmpeg命令使用RTP发送TS流

通过以下FFmpeg命令可以将一个mp4文件转换为ts流,并通过RTP协议对TS包进行封装发送(推流):

ffmpeg.exe -re -i input.mp4 -vcodec copy -acodec copy -f rtp_mpegts rtp://127.0.0.1:1234

其中:

“input.mp4”为输入(转换前)的媒体文件。

参数“-c:v copy -c:a copy”用于保持视频和音频的编码格式不变,只复制音视频流而不对其重新进行编解码。

“1234”为接收端需要创建的UDP服务器的端口号,推流端使用基于UDP的RTP将TS流发送到接收端的该端口。

二、接收端播放

通过命令:ffplay -protocol_whitelist "file,udp,rtp" -i rtp://127.0.0.1:1234 可以播放上述生成的RTP封装的TS流:

三、Wireshark抓包分析

通过Wireshark可以抓取上述生成的RTP封装的TS流。显示过滤器输入“rtp && !icmp”,使得Wireshark只显示RTP协议并把ICMP协议排除掉。这样界面就能只显示上述生成的RTP包装的TS流的数据包了:

(一)RTP header分析

选中其中一个RTP数据包(RTP packet),下图红框中显示的就是其RTP header(关于RTP header的格式可以参考:《音视频入门基础:RTP专题(7)——RTP协议简介》):

从上图中可以看到该RTP数据包的RTP header的payload type值为33,所以可以确定其RTP payload中存放的是MP2T,即MPEG2-TS格式的数据:

(二)TS Header分析

展开ISO/IEC 13818-1这一层(《ISO IEC 13818-1》是MPEG2-TS的官方文档),下图红框中显示的是该RTP包里面某个TS包(transport packet)的TS Header的信息(关于RTP header的格式可以参考:《音视频入门基础:MPEG2-TS专题(3)——TS Header简介》):

从上图中可以看到该TS包的TS Header的PID属性的值为0x0000,所以该TS包的payload为Program association table ,即 PAT表(具体可以参考:《音视频入门基础:MPEG2-TS专题(14)——PAT简介》)。通过Wireshark抓包可以看到,TS流会周期发送PAT信息。

(三)PAT表分析

展开PAT表(Program association table),可以看到其program_number为0x0001(即1),表示该TS流中有一个节目号为“1”的节目;program_map_PID为0x1000,表示要想获取这个节目的详细信息,就要去解析PID值为0x1000的PMT表(关于PMT表具体可以参考:《音视频入门基础:MPEG2-TS专题(16)——PMT简介》):

(四)PMT表分析

PID值为0x1000的PMT表如下。可以看到该PMT表中program_number为0x0001(即1),表示这是一个节目号为“1”的节目。该节目中有两个媒体流。第一个媒体流stream_type的值为0x1B,表示是H.264视频流,elementary_PID为0x100,所以该节目视频的PID为0x100;第二个媒体流stream_type的值为0x0F,表示是AAC音频流,elementary_PID为0x101,所以该节目音频的PID为0x101:

通过PMT表找到PID为0x100的视频流如下:

通过PMT表找到PID为0x101的音频流如下:

四、使用RTP发送TS流的优点

跟《音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流》的方法相比,使用RTP发送TS流的优点在于:RTP header中有一个占16位的序列号(sequence number),接收方可利用序列号检测数据包丢失并恢复数据包序列(接收端一般使用扩展序列号,见《音视频入门基础:RTP专题(7)——RTP协议简介》)。TS Header中虽然也有一个占4位的连续性计数器(continuity_counter)用于检查同一个PID的TS包(transport packet)的连续性,可以判断TS包是否连续以及丢失,但是continuity_counter只占4位,不够长,这就可能导致接收端无法正确排列 TS数据包,从而导致转储TS的播放损坏。

http://www.dtcms.com/a/108319.html

相关文章:

  • 【Word】批注一键导出:VBA 宏
  • C#核心学习(五)面向对象--封装(4)C#中的索引器详解:让对象像数组一样灵活访问
  • MySQL的数据目录以及日志
  • 企业网络优化方案:SD-WAN赋能企业远程办公
  • 使用JSON.stringify报错:Uncaught TypeError: cyclic object value
  • RNN模型与NLP应用——(6/9)Text Generation(文本自动生成)
  • UE小:在Unreal Engine 5中实现多层静态网格体遮挡拾取
  • 【落羽的落羽 C++】模板简介
  • 交易引擎中的设计模式
  • 「青牛科技」GC5331 5V三相无感正弦波电机驱动芯片 对标茂达APX9331/灿瑞OCH2360
  • Spring Cloud Gateway 的核心作用
  • Flutter项目之登录注册功能实现
  • Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件,如何配置route路由
  • SQL问题分析与诊断(8)——关键信息(2)
  • 数据结构----栈
  • LangChain/Eliza框架在使用场景上的异同,Eliza通过配置实现功能扩展的例子
  • 【力扣hot100题】(036)二叉树的最大深度
  • Spring Boot 工程创建详解
  • 小游戏中Enable Exceptions的各选项有何区别
  • 基于开源AI大模型与S2B2C模式的线下服务型门店增长策略研究——以AI智能名片与小程序源码技术为核心
  • 从静态到动态:D * 算法如何革新机器人路径规划
  • 图形渲染: tinyrenderer 实现笔记(Lesson 1 - 4)
  • ATEngin开发记录_1_在Vsiual Studio2022中使用ReShaper创建类模板
  • 理解激活函数,多个网络层之间如何连接
  • 红宝书第二十七讲:详解WebAssembly与asm.js如何实现高效执行
  • 七种分布式ID生成方式详细介绍--Redis、雪花算法、号段模式以及美团Leaf 等
  • 二分查找与二分答案入门c++
  • 如何对后端API进行负载测试
  • vue将组件中template转为js
  • codeforces C. Creating Keys for StORages Has Become My Main Skill