Asterisk播放mp4(2)——音頻封裝

Asterisk現(xiàn)有版本不支持播放視頻文件(支持視頻通話),無(wú)法滿足發(fā)送視頻通知、視頻IVR等場(chǎng)景。本系列文章,通過(guò)學(xué)習(xí)音視頻的相關(guān)知識(shí)和工具,嘗試實(shí)現(xiàn)一個(gè)通過(guò)Asterisk播放mp4視頻文件的應(yīng)用。

在音視頻媒體領(lǐng)域中,要區(qū)分容器格式和編碼格式。我理解,容器(container)是包含了描述媒體流的信息和媒體流數(shù)據(jù)的介質(zhì)(文件或網(wǎng)絡(luò)通道),其中可以包含多路媒體流。編碼格式描述的是媒體流中如何記錄數(shù)據(jù),例如:聲音采樣,一幀圖片等。本文學(xué)習(xí)音頻流處理時(shí)常用的容器,包括4個(gè)部分:WAV格式,MP3格式,RTP音頻傳輸和制作樣本數(shù)據(jù)。

WAV格式

WAV是微軟開(kāi)發(fā)的一種音頻文件格式,符合RIFF(資源互換文件格式)規(guī)范。RIFF,全稱Resource Interchange File Format,是一種按照標(biāo)記區(qū)塊存儲(chǔ)數(shù)據(jù)的通用文件存儲(chǔ)格式。符合RIFF規(guī)范的文件中,,最小存儲(chǔ)單位為“塊”(Chunk),每個(gè)塊(Chunk)包含三個(gè)部分:塊標(biāo)識(shí)(4字節(jié),如果不夠4字節(jié),在右邊以空格填充),塊長(zhǎng)度(4字節(jié),數(shù)據(jù)塊的長(zhǎng)度,不包括塊標(biāo)識(shí)和塊長(zhǎng)度的8個(gè)字節(jié),采用小子節(jié)序)和數(shù)據(jù)。RIFF格式規(guī)定,只有 RIFF及LIST塊可以含有子塊,其它的塊不允許包含子塊。WAV文件至少由3個(gè)塊構(gòu)成,分別是RIFF、fmt 和Data。所有基于壓縮編碼的WAV文件必須含有fact塊。此外所有其它塊都是可選的。塊fmt,Data及fact均為RIFF塊的子塊。

image.png

MP3格式

MP3截掉了大量的冗余信號(hào)和無(wú)關(guān)的信號(hào),編碼器通過(guò)混合濾波器組將原始聲音變換到頻率域,利用心理聲學(xué)模型,估算剛好能被察覺(jué)到的噪聲水平,再經(jīng)過(guò)量化,轉(zhuǎn)換成Huffman編碼,形成MP3位流。MP3是一種有損壓縮,壓縮比在1:10到1:12之間。

理解MP3,首先需要搞清版本(version)和層(layer)的概念,版本包括:MPEG-1(ISO/IEC 11172-3),MPEG-2(ISO/IEC 13818-3)和MPEG-2.5(不是官方標(biāo)準(zhǔn));層包括:Layer-1,Layer-2和Layer-3。MP3的版本和層不是迭代升級(jí)的關(guān)系,而是為了適應(yīng)不同使用場(chǎng)景,最主要的指標(biāo)就是針對(duì)不同的采樣率。

MPEG-1: Specifies the coded representation of high quality audio for storage media and the method for decoding of high quality audio signals. Is intended for application to digital storage media providing a total continuous transfer rate of about 1,5 Mbit/s for both audio and video bitstreams, such as CD, DAT and magnetic hard disc, and for sampling rates of 32 kHz, 44,1 kHz, and 48 kHz.

MPEG-2: In order to achieve better audio quality at very low bit rates (<64 kbit/s per audio channel), in particular if compared with ITU-T (formerly CCITT) Recommendation G.722 performance, three additional sampling frequencies are provided for ISO/IEC 11172-3 layers I, II and III. The additional sampling frequencies (Fs) are 16 kHz, 22,05 kHz and 24 kHz.

MPEG-2.5: 由于MPEG-2定義的最低的采樣率為16kHz,于是Fraunhofer(是個(gè)德國(guó)的研究所)便對(duì)此進(jìn)行擴(kuò)展,將原來(lái)MPEG-2所支持的低采樣率再除以2,得到: 8, 11.025, 和 12 kHz ,稱為 "MPEG 2.5"。

Layer-1的編碼器最為簡(jiǎn)單,編碼器的輸出數(shù)據(jù)率為384 kb/s,主要用于小型數(shù)字盒式磁帶(digital compact cassette,DCC)。

Layer-2的編碼器的復(fù)雜程度屬中等,編碼器的輸出數(shù)據(jù)率為256 kb/s~192 kb/s,其應(yīng)用包括數(shù)字廣播聲音(digital broadcast audio,DBA)、數(shù)字音樂(lè)、CD-I(compact disc-interactive)和VCD(video compact disc)等。

Layer-3的編碼器最為復(fù)雜,編碼器的輸出數(shù)據(jù)率為64 kb/s,主要應(yīng)用于ISDN上的聲音傳輸。

MP3文件結(jié)構(gòu)

MP3文件大體上分為三個(gè)部分:ID3v2(不影響對(duì)音頻的解析,放音時(shí)可以跳過(guò)) + 音頻數(shù)據(jù)(MP3編碼的幀序列,每個(gè)幀包含幀頭和數(shù)據(jù)兩部分,幀和幀相互獨(dú)立) + ID3v1(文件尾部128字節(jié),可選)。

ID3v2

ID3v2標(biāo)簽用于記錄mp3文件的元數(shù)據(jù),標(biāo)簽頭中標(biāo)記是否包含擴(kuò)展頭(Extended Header),填充(Padding)等部分。ID3v2標(biāo)簽至少包含1個(gè)標(biāo)簽幀(frame),每幀描述了文件的某個(gè)信息,例如:作者,專輯等等。ID3v2標(biāo)簽內(nèi)部采用大字節(jié)序。

image.png

音頻數(shù)據(jù)

每個(gè)音頻數(shù)據(jù)幀由4個(gè)部分組成:幀頭(4字節(jié),必須),CRC(2字節(jié),可選),邊信息(9,17或32字節(jié),必須),VBR頭(8-120字節(jié),可選),音頻編碼數(shù)據(jù)(必須)。

Side Infomation(邊信息): If joint stereo is used in M/S (middle/side) mode, the left and right channels aren't encoded separately. Instead, a "middle" channel is encoded as the sum of the left and right channels, while a " side" channel is stored as the difference between the left and the right. During the decoding process, side information is read back out of the frame and applied to the bitstream so that the original signal can be reconstructed as accurately as possible. The side information is essentially a set of instructions on how the whole puzzle should be re-assembled on the other end.

MP3有兩種編碼方式:1,CBR(固定位率),幀的大小在整個(gè)文件中都是是固定的;2,VBR(可變位率),VBR是XING公司推出的算法,所以在MP3的FRAME里會(huì)有“Xing"這個(gè)關(guān)鍵字(也有用"Info"來(lái)標(biāo)識(shí)的),它存放在MP3文件中的第一個(gè)有效幀的數(shù)據(jù)區(qū)里,它標(biāo)識(shí)了這個(gè)MP3文件是VBR的。同時(shí)第一個(gè)幀里存放了MP3文件的幀的總個(gè)數(shù),這就很容易獲得播放總時(shí)間,同時(shí)還有100個(gè)字節(jié)存放了播放總時(shí)間的100個(gè)時(shí)間分段的幀索引,假設(shè)4分鐘的MP3歌曲,240S,分成100段,每?jī)蓚€(gè)相鄰INDEX的時(shí)間差就是2.4S,所以通過(guò)這個(gè)INDEX,只要前后處理少數(shù)的FRAME,就能快速找出我們需要快進(jìn)的幀頭。其實(shí)這第一幀就相當(dāng)于文件頭了。不過(guò)現(xiàn)在有些編碼器在編碼CBR文件時(shí)也像VBR那樣將信息記入第一幀,比如著名的lame,它使用"Info"來(lái)做CBR的標(biāo)記。

RTP音頻傳輸

RTP全名是Real-time Transport Protocol(實(shí)時(shí)傳輸協(xié)議)。RTP用來(lái)為IP網(wǎng)上的語(yǔ)音、圖像、傳真等多種需要實(shí)時(shí)傳輸?shù)亩嗝襟w數(shù)據(jù)提供端到端的實(shí)時(shí)傳輸服務(wù)。RTP為端到端的實(shí)時(shí)傳輸提供時(shí)間信息和流同步,但并不保證服務(wù)質(zhì)量,服務(wù)質(zhì)量由RTCP來(lái)提供。我理解RTP就是一種容器,核心是解決通過(guò)網(wǎng)絡(luò)實(shí)時(shí)傳遞數(shù)據(jù)的問(wèn)題。

RTP幀頭

12個(gè)字節(jié)是固定的RTP幀頭,每個(gè)幀都會(huì)攜帶;貢獻(xiàn)源列表(CSRC List):0~15項(xiàng)(實(shí)際的數(shù)量由CC字段指定),每項(xiàng)32比特,用來(lái)標(biāo)志對(duì)一個(gè)RTP混合器產(chǎn)生的新包有貢獻(xiàn)的所有RTP包的源;再后面就是攜帶的數(shù)據(jù)(payload)。

RTP頭中各個(gè)字段的信息將在后續(xù)的文章中詳細(xì)解析,這里先關(guān)注一下PT(payload type)字段。PT指明了RTP傳遞的數(shù)據(jù)類型,值0-95是有預(yù)定義的(RFC3551),例如:8是pcma,0是pcmu等,96-127是動(dòng)態(tài)指定的。通過(guò)asterisk建立通話的過(guò)程中,要通過(guò)sip傳遞sdp,sdp中指定了要建立的rtp通道的相關(guān)參數(shù),例如:端口,媒體類型和媒體參數(shù)等,sdp中指定的媒體類和rtp頭中的PT字段相對(duì)應(yīng)。

rfc3551

除了關(guān)注Payload type外,還要注意MTU(最大傳輸單元,Maximum Transmission Unit),它是數(shù)據(jù)鏈路層的概念,用于限制數(shù)據(jù)包的大?。ɡ纾篒P包),如果數(shù)據(jù)包大于這個(gè)值就會(huì)拆包或丟棄,取值一般是1500(或1492)字節(jié)。一個(gè)RTP包中,IP+UDP+RTP頭=20+8+12=40字節(jié)。這樣一個(gè)RTP最大的載荷數(shù)據(jù)為1460字節(jié)。

制作樣本數(shù)據(jù)

WAV格式

生成一段10秒鐘音頻文件,編碼格式為pcm_s16le,容器格式為wav:

ffmpeg -lavfi sine -t 10 -f wav -c:a pcm_s16le sine-10s-s16le.wav

生成的文件大小為882078字節(jié),我們知道10秒鐘44.1k采樣率單聲道pcm_s16le編碼的裸流大小為882000,那么wav容器編碼就是增加78字節(jié)的文件頭。下面我們看看這78字節(jié)的內(nèi)容:

image.png
  • RIFF塊
子節(jié)位置 字節(jié)數(shù) 字段 數(shù)值 解析
0-3 4 塊標(biāo)識(shí) 5249 4646 ASCII碼,大寫(xiě)RIFF,指明塊是RIFF塊。
4-7 4 塊大小 9675 0d00 小字節(jié)序,882070,數(shù)據(jù)塊大小。
8-11 4 格式 5741 5645 ASCII碼,大寫(xiě)WAVE,說(shuō)明文件格式

文件的大小是882078,要減去12個(gè)字節(jié),還剩882066字節(jié)需要解析。

  • fmt子塊
子節(jié)位置 字節(jié)數(shù) 字段 數(shù)值 解析
12-15 4 塊標(biāo)識(shí) 666d 7420 ASCII碼,小寫(xiě)fmt,注意最后1個(gè)字節(jié)填充的是空格(20),指明塊是fmt塊。
16-19 4 塊大小 1000 0000 小字節(jié)序,16,數(shù)據(jù)塊大小。不同音頻編碼格式數(shù)據(jù)塊的長(zhǎng)度并不相同,詳細(xì)內(nèi)容看參考鏈接。
20-21 2 音頻格式(AudioFormat) 0100 小字節(jié)序,1,PCM/非壓縮格式。(其他格式的定義查看參考資料)
22-23 2 聲道數(shù)(NumChannels) 0100 小字節(jié)序,1,單聲道。有幾個(gè)聲道就是幾。
24-27 4 采樣率(SampleRate) 44ac 0000 小字節(jié)序,44100。
28-31 4 傳輸速率(ByteRate) 8858 0100 小字節(jié)序,88200,每個(gè)采樣2個(gè)字節(jié),所以每秒要傳輸88200字節(jié)。
32-33 2 數(shù)據(jù)塊對(duì)齊單位(BlockAlign) 0200 小字節(jié)序,2,該數(shù)值為:聲道數(shù)×位數(shù)/8。
34-35 2 采樣位數(shù)(BitsPerSample) 0010 小字節(jié)序,8,每個(gè)采樣8位二進(jìn)制。

fmt子塊一共24個(gè)字節(jié),882066減24,還有882042個(gè)字節(jié)需要解析。

  • LIST子塊
子節(jié)位置 字節(jié)數(shù) 字段 數(shù)值 解析
36-39 4 塊標(biāo)識(shí) 4c49 5354 ASCII碼,大寫(xiě)LIST,指明塊是LIST塊。
40-43 4 塊大小 1a00 0000 小字節(jié)序,26,數(shù)據(jù)塊大小。
44-47 4 塊類型 494e 464f ASCII碼,大寫(xiě)INFO。這個(gè)塊是用來(lái)描述文件信息的,并不影響解析,大體知道就行。
48-51 4 塊標(biāo)識(shí) 4953 4654 ASCII碼,大寫(xiě)ISFT,創(chuàng)建文件的軟件。
52-55 4 塊大小 0e00 0000 小字節(jié)序,14,數(shù)據(jù)塊大小。
56-69 14 塊數(shù)據(jù) 4c61-3000 Lavf58.29.100

LIST子塊一共34個(gè)字節(jié),882042減34,還有882008個(gè)字節(jié)需要解析。

  • data子塊
子節(jié)位置 字節(jié)數(shù) 字段 數(shù)值 解析
70-73 4 塊標(biāo)識(shí) 6461 7461 ASCII碼,小寫(xiě)data,指明塊是data塊。
74-77 4 塊大小 5075 0d00 小字節(jié)序,882000,數(shù)據(jù)塊大小,和裸流字節(jié)數(shù)一致。

至此,78個(gè)字節(jié)的文件頭解析完畢。由此可以進(jìn)一步理解:容器是媒體流的描述信息和數(shù)據(jù)流,只有提供了描述信息,解析程序才知道如何讀取數(shù)據(jù)流。

MP3格式

ffmpeg -lavfi sine -t 10 -f mp3 -c:a mp3 sine-10s.mp3

image.png

生成的mp3文件是單聲道,采樣率44.1k。文件大小80475字節(jié),是WAV格式882078字節(jié)的1/11,極大減少了存儲(chǔ)空間。

ID3v2頭

image.png
  • 標(biāo)簽頭
子節(jié)位置 字節(jié)數(shù) 字段 數(shù)值 解析
0-2 3 標(biāo)簽頭標(biāo)識(shí) 4944 33 ASCII碼,ID3,必須以此開(kāi)頭,說(shuō)明是ID3v2標(biāo)簽。
3-4 2 版本號(hào) 04 00 4,0,表示為ID3v2.4.0版本。
5 1 標(biāo)識(shí)字節(jié) 00 具體解釋查看參考資料。其中第6位(左邊第2位)指明是否包含擴(kuò)展頭,第4位(左邊第4位)指明是否包含尾(footer)。
6-9 4 標(biāo)簽大小 0000 0023 每個(gè)字節(jié)去掉首位后的28位二進(jìn)制數(shù)。

The ID3v2 tag size is the sum of the byte length of the extended
header, the padding and the frames after unsynchronisation. If a
footer is present this equals to ('total size' - 20) bytes, otherwise
('total size' - 10) bytes.

ID3標(biāo)簽的大小是35字節(jié),加上10字節(jié)的頭,所以總長(zhǎng)度是45個(gè)字節(jié)。

  • 標(biāo)簽幀
子節(jié)位置 字節(jié)數(shù) 字段 數(shù)值 解析
10-13 4 幀ID 5453 5345 ASCII碼,TSSE(Software/Hardware and settings used for encoding)
14-17 4 幀大小 0000 000f 15字節(jié),不包含幀頭的10字節(jié)。
18-19 2 標(biāo)志 0000 描述幀的特征,不影響解析,可以不深究。
20-34 15 幀數(shù)據(jù) 034c ... 3030 00 Lavf58.29.100

10個(gè)字節(jié)的頭和15字節(jié)的數(shù)據(jù),共25個(gè)字節(jié)。

  • 填充(Padding)

在ID3v2標(biāo)簽在尾部填充了10個(gè)空字節(jié)(0x00),把差的10個(gè)字節(jié)湊齊。

數(shù)據(jù)第1幀

image.png
  • 幀頭

幀頭32個(gè)字節(jié),ff fb 40 c0,由11個(gè)部分組成,用如下方式AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM(00_0000)標(biāo)記。

A_11 B_2 C_2 D_1 E_4 F_2 G_1 H_1 I_2 J_2 K_1 L_1 M_2
1111 1111 111 11 01 1 0100 00 0 0 11 00 0 0 00
標(biāo)記 位數(shù) 位置 描述
A 11 31-21 1111 1111 1 同步信息,所有位均為1,表示幀開(kāi)始。
B 2 20-19 11 版本,MPEG1。
C 2 18-17 01 層,Layer3。
D 1 16 1 CRC校驗(yàn),等于1,不校驗(yàn)。
E 4 15-12 0100 傳輸率,等于0100,56kbps。需要查對(duì)照表(看參考資料)。
F 2 11-10 00 采樣率,等于00,44.1kHz。
G 1 9 0 填充位,等于0,不需要。
H 1 8 0 保留字
I 2 7-6 11 聲道模式,11-單聲道
J 2 5-4 00 擴(kuò)充模式,無(wú)
K 1 3 0 版權(quán),0-不合法
L 1 2 0 原版標(biāo)識(shí),0-非原版
M 2 1-0 00 強(qiáng)調(diào)方式,等于00,未定義。

需要注意采樣率(11-10位)是和版本和層有對(duì)應(yīng)關(guān)系的,其取值對(duì)照含義如下表:

bits MPEG1 MPEG2 MPEG2.5
00 44100 22050 11025
01 48000 24000 12000
10 32000 16000 8000
11 reserv. reserv. reserv.
  • 邊(Side Info)

17字節(jié),首幀中數(shù)據(jù)全是0,還沒(méi)有找到詳細(xì)的解釋。真正的數(shù)據(jù)幀這部分信息都是有對(duì)應(yīng)值的,解碼器要根據(jù)這些信息才能把數(shù)據(jù)解出來(lái)。

  • VBR頭(Info(Xing))
位置 長(zhǎng)度 說(shuō)明
0 4 496e 666f ASCII碼,Info。VBR頭是Xing公司提出的,所以也有用Xing作為標(biāo)識(shí)的情況。
4 4 0000 000f 標(biāo)志顯示當(dāng)前字段的標(biāo)志,與邏輯或邏輯相結(jié)合。字段是強(qiáng)制性的。0x00000001 - 包含幀數(shù)字段;0x00000002 - 包含字節(jié)數(shù)字段;0x00000004 - 包含TOC部分 ;0x00000008 - 包含質(zhì)量指示(0-100)。說(shuō)明后面的4個(gè)部分內(nèi)容都有。
8 4 0000 0180 384 幀數(shù)量 Number of Frames as Big-Endian DWORD (optional)
8 or 12 4 0001 3a2e 80430 幀字節(jié)數(shù)(去掉ID3標(biāo)簽) Number of Bytes in file as Big-Endian DWORD (optional)
8, 12 or 16 100 - 100 TOC entries for seeking as integral BYTE
8, 12, 16, 108, 112 or 116 4 0000 0000 Quality indicator as Big-Endian DWORDfrom 0 - best quality to 100 - worst quality
幀頭 邊信息 VBR標(biāo)記 填充
4字節(jié) 17字節(jié) 120 字節(jié) 41字節(jié)

VBR頭后面存儲(chǔ)編碼器的信息,比如 lame 在其后就是存儲(chǔ)其版本,把第1幀填滿。

后續(xù)數(shù)據(jù)幀

MP3中每幀的采樣數(shù)和版本和層的對(duì)照是固定的,如下表:

MPEG1 MPEG2 MPEG2.5
Layer1 384 384 384
Layer2 1152 1152 1152
Layer3 1152 576 576

根據(jù)該表可知每幀的采樣數(shù)是1152個(gè),采樣率是44100,每幀字節(jié)數(shù):56(比特率)/44.1(采樣率)x1152(幀采樣數(shù))/8 = 182字節(jié)(截?cái)嘈?shù)部分)。首幀的地址為2d,向后182個(gè)字節(jié)e3,是第2幀的開(kāi)始位置。通過(guò)這種方式就可以找到后面每一幀的起始地址。

第2幀的起始地址0x00e3,幀頭為ff fb 50 c4。

A_11 B_2 C_2 D_1 E_4 F_2 G_1 H_1 I_2 J_2 K_1 L_1 M_2
1111 1111 111 11 01 1 0101 00 0 0 11 00 0 1 00

傳輸率和首幀的值不同,為0101,對(duì)應(yīng)64kbps,計(jì)算幀大小為208字節(jié)(截?cái)嘈?shù)部分)。

第3幀的起始地址0x01b3,幀頭為ff fb 52 c4。

A_11 B_2 C_2 D_1 E_4 F_2 G_1 H_1 I_2 J_2 K_1 L_1 M_2
1111 1111 111 11 01 1 0101 00 1 0 11 00 0 1 00

和第1幀填充位值不同,等于1,需要填充。幀大小為截?cái)嗪蠹?,等于209。

第4幀的起始地址0x0284,和計(jì)算結(jié)果一致。

轉(zhuǎn)換為PCM

我們研究的目標(biāo)是通過(guò)asterisk進(jìn)行媒體的播放,mp3是一種有損壓縮,那么將mp3轉(zhuǎn)碼為pcm后失真是否嚴(yán)重?下面將ffmpeg生成的mp3格式的sine波形轉(zhuǎn)換為pcm_s16le,看看波形的變化。

ffmpeg -i sine-10s.mp3 -f s16le -c:a pcm_s16le sine-mp32s16le-10s.s16le

MP3轉(zhuǎn)s16le和原始數(shù)據(jù)對(duì)比

紅色為原始pcm_s16le的數(shù)據(jù),藍(lán)色為mp3轉(zhuǎn)換的結(jié)果。

MP3轉(zhuǎn)換的結(jié)果
原始pcm_s16le

雖然MP3確實(shí)導(dǎo)致了數(shù)據(jù)的損失,但是總體上還是很好的保持了波形。(MP3確實(shí)很厲害,只是原始數(shù)據(jù)的1/10不到,但是損失很?。。?/p>

8k采樣率的MP3

前面用ffmpeg默認(rèn)生成的mp3文件的采樣率是44.1k,而且按照mp3的規(guī)范我們知道不同采樣率會(huì)對(duì)應(yīng)不同的版本和層,那么ffmpeg是否能生成一個(gè)采樣率是電話系統(tǒng)常用的8k采樣率的mp3?

ffmpeg -lavfi sine -t 10 -ar 8000 -f mp3 -c:a mp3 sine-8k-10s.mp3

image.png

文件的大小為10413字節(jié),小了很多。

8k MP3

首幀的頭為ff e3 38 c0,解析如下:

A_11 B_2 C_2 D_1 E_4 F_2 G_1 H_1 I_2 J_2 K_1 L_1 M_2
1111 1111 111 00 01 1 0011 10 0 0 11 00 0 0 00

版本域(B)的值是00,對(duì)應(yīng)的是MPEG version2.5;層域(C)的值是01,對(duì)應(yīng)的是Layer3;比特率域(E)的值是0011,對(duì)應(yīng)的是24kbps;采樣率域(F)的值是10,對(duì)應(yīng)的是8000

從這個(gè)結(jié)果看,我們可以將從電話系統(tǒng)收到的8k音頻數(shù)據(jù)保存為8k的mp3文件。

RTP音頻流

ffmpeg -lavfi sine -f rtp rtp://127.0.0.1:5005

Ffmpeg輸出

注意這時(shí)輸出的sdp信息,payload type的值是97,對(duì)應(yīng)的參數(shù)是PCMU/44100/1,含義是編碼格式PCMU,采樣率44100,單聲道。

下面改變一下輸出的參數(shù):

ffmpeg -lavfi sine -ar 8000 -c:a pcm_alaw -f rtp rtp://127.0.0.1:5005

Ffmpeg輸出

前面提到過(guò)8是預(yù)定義的媒體類型,對(duì)應(yīng)的是pcma/8000/1。

下面我們通過(guò)wireshark抓包看一下通過(guò)RTP傳送的數(shù)據(jù)什么樣。執(zhí)行如下命令 ,啟動(dòng)nc監(jiān)聽(tīng)端口5005,ffmpeg向端口發(fā)送RTP包(直接用過(guò)濾器生成波形無(wú)法控制播放速率,導(dǎo)致收到的結(jié)果不爭(zhēng)取,所以改成播放生成好的文件,添加-re參數(shù)播放速率),啟動(dòng)wireshark抓包:

ffmpeg -lavfi sine -t 10 -ar 8000 -f alaw -c:a pcm_alaw sine-8k-10s.alaw

nc -lu 5005

ffmpeg -re -ar 8000 -f alaw -i sine-8k-10s.alaw -c:a pcm_alaw -f rtp rtp://127.0.0.1:5005

將抓包結(jié)果解碼為RTP包,在協(xié)議列(Protocol)選中一個(gè)UDP的格子:

wireshark解碼UDP
Wireshark解碼UDP
UDP解碼為RTP
查看媒體流分析結(jié)果

下面我們查看一幀RTP數(shù)據(jù)的內(nèi)部:

RTP包數(shù)據(jù)
alaw文件中的數(shù)據(jù)

由上兩圖可以看到,RTP Payload中的數(shù)據(jù)和原始alaw文件中數(shù)據(jù)完全一致,說(shuō)明Payload中的數(shù)據(jù)是Payload type指定的格式。Payload的大小是320字節(jié),也就是攜帶了320個(gè)采樣,也就是0.0.4秒的時(shí)長(zhǎng)。 前面提到過(guò),Payload的大小受MTU的限制,所以ffmpeg發(fā)送數(shù)據(jù)時(shí)會(huì)控制每個(gè)RTP包中包含的采樣數(shù)。

參考資料

wav文件格式分析與詳解

MP3 wiki

ID3v2.3 詳細(xì)

ID3v2.4

解釋音頻幀頭的資料

MP3 Inside

RTP: A Transport Protocol for Real-Time Applications

RTP Profile for Audio and Video Conferences with Minimal Control

什么是MTU?為什么MTU值普遍都是1500? 6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容