音視頻入門基礎: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.pswp.cn/pingmian/75303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75303.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(六)窗口表面

這節主要三部分 一,窗口表面的創建和銷毀 二,呈現隊列 三,與以前實現的圖形能力隊列的兼容 一,窗口表面 1,創建 VkSurfaceKHR surface; //創建窗口表面 glfwCreateWindowSurface(instance, //vkInstance對象window, …

【零基礎入門unity游戲開發——2D篇】SpriteEditor圖片編輯器

考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…

云巔之上:數字文明的重構與超越

序章:算力新紀元 2024年初春,當SpaceX的星艦將首批云計算節點送入近地軌道時,地球上的數字原住民們正通過云端AI助手規劃著一天的行程。這場靜默的革命已悄然進入新階段——云計算不再只是工具,而是成為數字文明的"第六元素…

【面試篇】多線程

基礎概念 線程的生命周期有哪些狀態?它們是如何轉換的? 答案:線程的生命周期有以下六種狀態: 新建(New):線程被創建但尚未啟動,此時線程對象已被分配內存空間,相關屬性已…

unity運行中場景指定模型回放功能(模型是地形并且可以加載預制體進行回放)

回放和加載腳本 using System.Collections.Generic; using UnityEngine;public class TerrainRecorder : MonoBehaviour {[Header("基本設置")]public Terrain targetTerrain;public bool isRecording false;public bool isPlayingBack false;[Range(0.02f, 1f)] …

基于SpringBoot的河道水情大數據可視化分析平臺設計與實現(源碼+論文+部署講解等)

需要資料,請文末聯系 一、平臺介紹 水情監測數據大屏 - 平臺首頁 日均水位 日均水速 二、論文內容 摘要(中文) 本文針對河道水情監測領域的數據管理和可視化分析需求,設計并實現了一套河道水情大數據可視化分析平臺。該平臺基…

Knife4j文檔請求異常 空指針

打開swagger文檔報空指針異常 java.lang.NullPointerException: nullat springfox.documentation.oas.mappers.SchemaMapper.model(SchemaMapper.java:97)at springfox.documentation.oas.mappers.SchemaMapper.mapModel(SchemaMapper.java:85)at springfox.documentation.oas…

車輛選擇解決方案

車輛選擇解決方案 /* * Purpose: 添加車輛選擇的功能 -> 用戶在選擇不同的車輛時,重新初始化系統狀態,清除之前的定時器,并根據新選擇的車輛設置新的定時器,以實現對新車輛狀態的實時加載。 * File Name: 車輛選擇解決方案 * …

魔塔社區使用llamafactory微調AI閱卷試題系統

啟動 LLaMA-Factory 1. 安裝 LLaMA-Factory 執行安裝指令 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e ".[torch,metrics]"解決依賴沖突 如果遇到依賴沖突,可使用以下命令安裝,不…

程序化廣告行業(51/89):Cookie映射與移動設備ID映射解析

程序化廣告行業(51/89):Cookie映射與移動設備ID映射解析 在當今數字化營銷的浪潮中,程序化廣告已經成為企業精準觸達目標客戶的重要手段。作為一名對程序化廣告充滿興趣的學習者,我希望通過這篇博客和大家一起深入探索…

內網服務器centos7安裝jdk17

1. 下載 JDK 17 安裝包(在外網環境操作) 在可聯網的機器上下載 JDK 17 的壓縮包(推薦使用 OpenJDK): OpenJDK 官方源: Adoptium Eclipse Temurin Azul Zulu 直接下載命令示例(在外網機器上執行…

【學Rust寫CAD】21 2D 點(point.rs)

源碼 //matrix/point.rs use std::ops::Mul; use super::algebraic_units::{Zero, One}; use super::generic::Matrix;/// 點坐標結構體 #[derive(Debug, Clone, Copy, PartialEq)] pub struct Point<X, Y>(Matrix<X, Y, One, Zero, Zero, One>);impl<X, Y>…

《AI大模型應知應會100篇》第7篇:Prompt Engineering基礎:如何與大模型有效溝通

第7篇&#xff1a;Prompt Engineering基礎&#xff1a;如何與大模型有效溝通 摘要 Prompt Engineering&#xff08;提示工程&#xff09;是與大模型高效溝通的關鍵技能。通過精心設計的Prompt&#xff0c;可以讓模型生成更準確、更有用的結果。本文將從基礎知識到高級策略&…

Java高頻面試題1:Java SE

一、Java概述 1. Java語言的特點&#xff1f; 面向對象&#xff1a;封裝、繼承、多態。跨平臺&#xff1a;通過JVM實現“一次編寫&#xff0c;到處運行”。內存管理&#xff1a;自動垃圾回收&#xff08;GC&#xff09;&#xff0c;避免手動內存管理。多線程&#xff1a;內置…

基于RapidIO接口的DSP+GPU工業AI實時計算解決方案

基于RapidIO接口的DSPGPU工業AI實時計算解決方案是一種面向高性能、低延遲工業應用的異構計算架構&#xff0c;適用于工業自動化、機器視覺、預測性維護、機器人控制等場景。以下是該方案的核心設計思路和技術要點&#xff1a; 1. 方案背景與目標 工業需求&#xff1a; 工業…

SQL DB 數據類型

SQL DB 數據類型 引言 在數據庫管理系統中,數據類型是定義和存儲數據的方式。SQL(結構化查詢語言)數據庫中的數據類型決定了數據的存儲格式、大小、取值范圍以及如何處理數據。合理選擇和使用數據類型對于確保數據庫性能、數據完整性和應用程序的準確性至關重要。 SQL 數…

常見電源模塊設計

目錄 1. 5V電源模塊 2. 3.3V電源模塊 3. 1.9V電源模塊 4. 220V轉12V電源模塊 1. 5V電源模塊 參考電路 電路說明&#xff1a; 這個電路采用的是穩壓芯片78L05&#xff0c;我是用的12V的電源模塊轉成為5V,為后續的供電。 2. 3.3V電源模塊 參考電路&#xff1a; 電路說明…

python操作es

1、常用操作 ### 創建索引 bash curl -u elastic:123 -X PUT -H "Content-Type: application/json" -d mapping.json "http://0.0.0.0:9200/ai_kg_extraction_new_lower_tag_index" ### 刪除索引 bash curl -u elastic:123 -X DELETE "http://0.0…

記一個.NET AOT交叉編譯時的坑

記一個.NET AOT交叉編譯時的坑 背景&#xff1a; 使用.NET9開發的Avalonia項目需要部署到Linux-arm64 踩坑&#xff1a; 根據官方AOT交叉編譯文檔配置后執行打包 dotnet publish -r linux-arm64提示error : The PrivateSdkAssemblies ItemGroup is required for _ComputeA…

【Linux篇】探索進程地址空間:計算機背后的虛擬世界

進程地址空間的奧秘&#xff1a;讓你理解程序如何在計算機中生存 一. 程序地址空間1.1 基本概念1.2 虛擬內存管理1.3 為什么存在虛擬地址空間1.3.1 意義 2. 最后 本文將介紹進程地址空間的基本概念與結構&#xff0c;幫助讀者理解操作系統如何管理和分配內存。進程地址空間指的…