Asterisk現(xiàn)有版本不支持播放視頻文件(支持視頻通話),無法滿足發(fā)送視頻通知故硅、視頻IVR等場景庶灿。本系列文章,通過學習音視頻的相關(guān)知識和工具吃衅,嘗試實現(xiàn)一個通過Asterisk播放mp4視頻文件的應用往踢。
- Asterisk播放mp4(1)——音頻和PCM編碼
- Asterisk播放mp4(2)——音頻封裝
- Asterisk播放mp4(3)——搭建開發(fā)環(huán)境
- Asterisk播放mp4(4)——H264&AAC
- Asterisk播放mp4(5)——MP4文件解析
- Asterisk播放mp4(6)——音視頻同步
- Asterisk播放mp4(7)——DTMF
在音視頻媒體領(lǐng)域中,要區(qū)分容器格式和編碼格式徘层。我理解峻呕,容器(container)是包含了描述媒體流的信息和媒體流數(shù)據(jù)的介質(zhì)(文件或網(wǎng)絡通道)利职,其中可以包含多路媒體流。編碼格式描述的是媒體流中如何記錄數(shù)據(jù)瘦癌,例如:聲音采樣眼耀,一幀圖片等。本文學習音頻流處理時常用的容器佩憾,包括4個部分:WAV格式哮伟,MP3格式,RTP音頻傳輸和制作樣本數(shù)據(jù)妄帘。
WAV格式
WAV是微軟開發(fā)的一種音頻文件格式楞黄,符合RIFF(資源互換文件格式)
規(guī)范。RIFF抡驼,全稱Resource Interchange File Format鬼廓,是一種按照標記區(qū)塊存儲數(shù)據(jù)的通用文件存儲格式。符合RIFF規(guī)范的文件中致盟,碎税,最小存儲單位為“塊”(Chunk),每個塊(Chunk)包含三個部分:塊標識(4字節(jié)馏锡,如果不夠4字節(jié)雷蹂,在右邊以空格填充),塊長度(4字節(jié)杯道,數(shù)據(jù)塊的長度匪煌,不包括塊標識和塊長度的8個字節(jié),采用小子節(jié)序)和數(shù)據(jù)党巾。RIFF格式規(guī)定萎庭,只有 RIFF及LIST塊可以含有子塊,其它的塊不允許包含子塊齿拂。WAV文件至少由3個塊構(gòu)成驳规,分別是RIFF、fmt 和Data署海。所有基于壓縮編碼的WAV文件必須含有fact塊吗购。此外所有其它塊都是可選的。塊fmt叹侄,Data及fact均為RIFF塊的子塊巩搏。
MP3格式
MP3截掉了大量的冗余信號和無關(guān)的信號昨登,編碼器通過混合濾波器組將原始聲音變換到頻率域趾代,利用心理聲學模型,估算剛好能被察覺到的噪聲水平丰辣,再經(jīng)過量化撒强,轉(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(不是官方標準);層包括:Layer-1胚吁,Layer-2和Layer-3旁壮。MP3的版本和層不是迭代升級的關(guān)系妄均,而是為了適應不同使用場景,最主要的指標就是針對不同的采樣率。
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(是個德國的研究所)便對此進行擴展,將原來MPEG-2所支持的低采樣率再除以2获高,得到: 8, 11.025, 和 12 kHz 驯杜,稱為 "MPEG 2.5"。
Layer-1的編碼器最為簡單窿侈,編碼器的輸出數(shù)據(jù)率為384 kb/s炼幔,主要用于小型數(shù)字盒式磁帶(digital compact cassette,DCC)史简。
Layer-2的編碼器的復雜程度屬中等江掩,編碼器的輸出數(shù)據(jù)率為256 kb/s~192 kb/s,其應用包括數(shù)字廣播聲音(digital broadcast audio乘瓤,DBA)环形、數(shù)字音樂、CD-I(compact disc-interactive)和VCD(video compact disc)等衙傀。
Layer-3的編碼器最為復雜抬吟,編碼器的輸出數(shù)據(jù)率為64 kb/s,主要應用于ISDN上的聲音傳輸统抬。
MP3文件大體上分為三個部分:ID3v2(不影響對音頻的解析火本,放音時可以跳過) + 音頻數(shù)據(jù)(MP3編碼的幀序列,每個幀包含幀頭和數(shù)據(jù)兩部分聪建,幀和幀相互獨立) + ID3v1(文件尾部128字節(jié)钙畔,可選)。
ID3v2
ID3v2標簽用于記錄mp3文件的元數(shù)據(jù)金麸,標簽頭中標記是否包含擴展頭(Extended Header)擎析,填充(Padding)等部分。ID3v2標簽至少包含1個標簽幀(frame)挥下,每幀描述了文件的某個信息揍魂,例如:作者桨醋,專輯等等。ID3v2標簽內(nèi)部采用大字節(jié)序现斋。
音頻數(shù)據(jù)
每個音頻數(shù)據(jù)幀由4個部分組成:幀頭(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(固定位率)调限,幀的大小在整個文件中都是是固定的舟陆;2,VBR(可變位率)耻矮,VBR是XING公司推出的算法秦躯,所以在MP3的FRAME里會有“Xing"這個關(guān)鍵字(也有用"Info"來標識的),它存放在MP3文件中的第一個有效幀的數(shù)據(jù)區(qū)里裆装,它標識了這個MP3文件是VBR的踱承。同時第一個幀里存放了MP3文件的幀的總個數(shù),這就很容易獲得播放總時間哨免,同時還有100個字節(jié)存放了播放總時間的100個時間分段的幀索引茎活,假設(shè)4分鐘的MP3歌曲,240S琢唾,分成100段载荔,每兩個相鄰INDEX的時間差就是2.4S,所以通過這個INDEX采桃,只要前后處理少數(shù)的FRAME懒熙,就能快速找出我們需要快進的幀頭。其實這第一幀就相當于文件頭了普办。不過現(xiàn)在有些編碼器在編碼CBR文件時也像VBR那樣將信息記入第一幀工扎,比如著名的lame,它使用"Info"來做CBR的標記衔蹲。
RTP音頻傳輸
RTP全名是Real-time Transport Protocol(實時傳輸協(xié)議)肢娘。RTP用來為IP網(wǎng)上的語音、圖像、傳真等多種需要實時傳輸?shù)亩嗝襟w數(shù)據(jù)提供端到端的實時傳輸服務蔬浙。RTP為端到端的實時傳輸提供時間信息和流同步,但并不保證服務質(zhì)量贞远,服務質(zhì)量由RTCP來提供畴博。我理解RTP
就是一種容器,核心是解決通過網(wǎng)絡實時傳遞數(shù)據(jù)的問題蓝仲。
前12
個字節(jié)是固定的RTP幀頭俱病,每個幀都會攜帶;貢獻源列表(CSRC List):0~15項(實際的數(shù)量由CC
字段指定)袱结,每項32比特亮隙,用來標志對一個RTP混合器產(chǎn)生的新包有貢獻的所有RTP包的源;再后面就是攜帶的數(shù)據(jù)(payload)垢夹。
RTP頭中各個字段的信息將在后續(xù)的文章中詳細解析溢吻,這里先關(guān)注一下PT(payload type)
字段。PT指明了RTP傳遞的數(shù)據(jù)類型果元,值0-95是有預定義的(RFC3551)促王,例如:8是pcma,0是pcmu等而晒,96-127是動態(tài)指定的蝇狼。通過asterisk建立通話的過程中,要通過sip
傳遞sdp
倡怎,sdp
中指定了要建立的rtp
通道的相關(guān)參數(shù)迅耘,例如:端口,媒體類型和媒體參數(shù)等监署,sdp
中指定的媒體類和rtp
頭中的PT
字段相對應颤专。
除了關(guān)注Payload type外,還要注意MTU(最大傳輸單元钠乏,Maximum Transmission Unit)血公,它是數(shù)據(jù)鏈路層的概念,用于限制數(shù)據(jù)包的大谢菏臁(例如:IP包)累魔,如果數(shù)據(jù)包大于這個值就會拆包或丟棄,取值一般是1500(或1492)字節(jié)够滑。一個RTP包中垦写,IP+UDP+RTP頭=20+8+12=40字節(jié)。這樣一個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)容:
- RIFF塊
子節(jié)位置 | 字節(jié)數(shù) | 字段 | 數(shù)值 | 解析 |
---|---|---|---|---|
0-3 | 4 | 塊標識 | 5249 4646 | ASCII碼,大寫RIFF么鹤,指明塊是RIFF塊终娃。 |
4-7 | 4 | 塊大小 | 9675 0d00 | 小字節(jié)序,882070蒸甜,數(shù)據(jù)塊大小棠耕。 |
8-11 | 4 | 格式 | 5741 5645 | ASCII碼,大寫WAVE柠新,說明文件格式 |
文件的大小是882078窍荧,要減去12個字節(jié),還剩882066字節(jié)需要解析恨憎。
- fmt子塊
子節(jié)位置 | 字節(jié)數(shù) | 字段 | 數(shù)值 | 解析 |
---|---|---|---|---|
12-15 | 4 | 塊標識 | 666d 7420 | ASCII碼蕊退,小寫fmt,注意最后1個字節(jié)填充的是空格(20)憔恳,指明塊是fmt塊咕痛。 |
16-19 | 4 | 塊大小 | 1000 0000 | 小字節(jié)序,16喇嘱,數(shù)據(jù)塊大小茉贡。不同音頻編碼格式數(shù)據(jù)塊的長度并不相同,詳細內(nèi)容看參考鏈接者铜。 |
20-21 | 2 | 音頻格式(AudioFormat) | 0100 | 小字節(jié)序腔丧,1,PCM/非壓縮格式作烟。(其他格式的定義查看參考資料) |
22-23 | 2 | 聲道數(shù)(NumChannels) | 0100 | 小字節(jié)序愉粤,1,單聲道拿撩。有幾個聲道就是幾衣厘。 |
24-27 | 4 | 采樣率(SampleRate) | 44ac 0000 | 小字節(jié)序,44100压恒。 |
28-31 | 4 | 傳輸速率(ByteRate) | 8858 0100 | 小字節(jié)序影暴,88200,每個采樣2個字節(jié)探赫,所以每秒要傳輸88200字節(jié)型宙。 |
32-33 | 2 | 數(shù)據(jù)塊對齊單位(BlockAlign) | 0200 | 小字節(jié)序,2伦吠,該數(shù)值為:聲道數(shù)×位數(shù)/8妆兑。 |
34-35 | 2 | 采樣位數(shù)(BitsPerSample) | 0010 | 小字節(jié)序魂拦,8,每個采樣8位二進制搁嗓。 |
fmt子塊一共24個字節(jié)芯勘,882066減24,還有882042個字節(jié)需要解析腺逛。
- LIST子塊
子節(jié)位置 | 字節(jié)數(shù) | 字段 | 數(shù)值 | 解析 |
---|---|---|---|---|
36-39 | 4 | 塊標識 | 4c49 5354 | ASCII碼荷愕,大寫LIST,指明塊是LIST塊屉来。 |
40-43 | 4 | 塊大小 | 1a00 0000 | 小字節(jié)序路翻,26狈癞,數(shù)據(jù)塊大小茄靠。 |
44-47 | 4 | 塊類型 | 494e 464f | ASCII碼,大寫INFO蝶桶。這個塊是用來描述文件信息的慨绳,并不影響解析,大體知道就行真竖。 |
48-51 | 4 | 塊標識 | 4953 4654 | ASCII碼脐雪,大寫ISFT,創(chuàng)建文件的軟件恢共。 |
52-55 | 4 | 塊大小 | 0e00 0000 | 小字節(jié)序战秋,14,數(shù)據(jù)塊大小讨韭。 |
56-69 | 14 | 塊數(shù)據(jù) | 4c61-3000 | Lavf58.29.100 |
LIST子塊一共34個字節(jié)脂信,882042減34,還有882008個字節(jié)需要解析透硝。
- data子塊
子節(jié)位置 | 字節(jié)數(shù) | 字段 | 數(shù)值 | 解析 |
---|---|---|---|---|
70-73 | 4 | 塊標識 | 6461 7461 | ASCII碼狰闪,小寫data,指明塊是data塊濒生。 |
74-77 | 4 | 塊大小 | 5075 0d00 | 小字節(jié)序埋泵,882000,數(shù)據(jù)塊大小罪治,和裸流字節(jié)數(shù)一致丽声。 |
至此,78個字節(jié)的文件頭解析完畢觉义。由此可以進一步理解:容器是媒體流的描述信息和數(shù)據(jù)流恒序,只有提供了描述信息,解析程序才知道如何讀取數(shù)據(jù)流谁撼。
MP3格式
ffmpeg -lavfi sine -t 10 -f mp3 -c:a mp3 sine-10s.mp3
生成的mp3文件是單聲道歧胁,采樣率44.1k滋饲。文件大小80475
字節(jié),是WAV格式882078
字節(jié)的1/11喊巍,極大減少了存儲空間屠缭。
ID3v2頭
- 標簽頭
子節(jié)位置 | 字節(jié)數(shù) | 字段 | 數(shù)值 | 解析 |
---|---|---|---|---|
0-2 | 3 | 標簽頭標識 | 4944 33 | ASCII碼,ID3崭参,必須以此開頭呵曹,說明是ID3v2標簽。 |
3-4 | 2 | 版本號 | 04 00 | 4何暮,0奄喂,表示為ID3v2.4.0版本。 |
5 | 1 | 標識字節(jié) | 00 | 具體解釋查看參考資料海洼。其中第6位(左邊第2位)指明是否包含擴展頭跨新,第4位(左邊第4位)指明是否包含尾(footer)。 |
6-9 | 4 | 標簽大小 | 0000 0023 | 每個字節(jié)去掉首位后的28位二進制數(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標簽的大小是35字節(jié)域帐,加上10字節(jié)的頭,所以總長度是45個字節(jié)是整。
- 標簽幀
子節(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 | 標志 | 0000 | 描述幀的特征龙优,不影響解析,可以不深究事秀。 |
20-34 | 15 | 幀數(shù)據(jù) | 034c ... 3030 00 | Lavf58.29.100 |
10個字節(jié)的頭和15字節(jié)的數(shù)據(jù)彤断,共25個字節(jié)。
- 填充(Padding)
在ID3v2標簽在尾部填充了10個空字節(jié)(0x00)秽晚,把差的10個字節(jié)湊齊瓦糟。
數(shù)據(jù)第1幀
- 幀頭
幀頭32個字節(jié),ff fb 40 c0
赴蝇,由11個部分組成菩浙,用如下方式AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM(00_0000)
標記。
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 |
標記 | 位數(shù) | 位置 | 值 | 描述 |
---|---|---|---|---|
A | 11 | 31-21 | 1111 1111 1 | 同步信息句伶,所有位均為1劲蜻,表示幀開始。 |
B | 2 | 20-19 | 11 | 版本考余,MPEG1先嬉。 |
C | 2 | 18-17 | 01 | 層,Layer3楚堤。 |
D | 1 | 16 | 1 | CRC校驗疫蔓,等于1含懊,不校驗。 |
E | 4 | 15-12 | 0100 | 傳輸率衅胀,等于0100岔乔,56kbps。需要查對照表(看參考資料)滚躯。 |
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 | 擴充模式,無 |
K | 1 | 3 | 0 | 版權(quán)息裸,0-不合法 |
L | 1 | 2 | 0 | 原版標識蝇更,0-非原版 |
M | 2 | 1-0 | 00 | 強調(diào)方式沪编,等于00呼盆,未定義。 |
需要注意采樣率(11-10位)是和版本和層有對應關(guān)系的蚁廓,其取值對照含義如下表:
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,還沒有找到詳細的解釋相嵌。真正的數(shù)據(jù)幀這部分信息都是有對應值的腿时,解碼器要根據(jù)這些信息才能把數(shù)據(jù)解出來。
- VBR頭(Info(Xing))
位置 | 長度 | 值 | 說明 |
---|---|---|---|
0 | 4 | 496e 666f | ASCII碼饭宾,Info批糟。VBR頭是Xing公司提出的,所以也有用Xing作為標識的情況看铆。 |
4 | 4 | 0000 000f | 標志顯示當前字段的標志徽鼎,與邏輯或邏輯相結(jié)合。字段是強制性的弹惦。0x00000001 - 包含幀數(shù)字段否淤;0x00000002 - 包含字節(jié)數(shù)字段;0x00000004 - 包含TOC部分 棠隐;0x00000008 - 包含質(zhì)量指示(0-100)石抡。說明后面的4個部分內(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標簽) 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標記 | 填充 |
---|---|---|---|
4字節(jié) | 17字節(jié) | 120 字節(jié) | 41字節(jié) |
在VBR
頭后面存儲編碼器的信息助泽,比如 lame 在其后就是存儲其版本啰扛,把第1幀填滿嚎京。
后續(xù)數(shù)據(jù)幀
MP3中每幀的采樣數(shù)和版本和層的對照是固定的,如下表:
MPEG1 | MPEG2 | MPEG2.5 | |
---|---|---|---|
Layer1 | 384 | 384 | 384 |
Layer2 | 1152 | 1152 | 1152 |
Layer3 | 1152 | 576 | 576 |
根據(jù)該表可知每幀的采樣數(shù)是1152個隐解,采樣率是44100挖藏,每幀字節(jié)數(shù):56(比特率)/44.1(采樣率)x1152(幀采樣數(shù))/8 = 182字節(jié)(截斷小數(shù)部分)。首幀的地址為2d
厢漩,向后182個字節(jié)e3
膜眠,是第2幀的開始位置。通過這種方式就可以找到后面每一幀的起始地址溜嗜。
第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
辟躏,對應64kbps
,計算幀大小為208字節(jié)(截斷小數(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瑞凑,需要填充。幀大小為截斷后加1概页,等于209籽御。
第4幀的起始地址0x0284
,和計算結(jié)果一致惰匙。
轉(zhuǎn)換為PCM
我們研究的目標是通過asterisk
進行媒體的播放技掏,mp3是一種有損壓縮,那么將mp3轉(zhuǎn)碼為pcm后失真是否嚴重项鬼?下面將ffmpeg生成的mp3格式的sine波形轉(zhuǎn)換為pcm_s16le哑梳,看看波形的變化。
ffmpeg -i sine-10s.mp3 -f s16le -c:a pcm_s16le sine-mp32s16le-10s.s16le
紅色為原始pcm_s16le的數(shù)據(jù)绘盟,藍色為mp3轉(zhuǎn)換的結(jié)果鸠真。
雖然MP3確實導致了數(shù)據(jù)的損失,但是總體上還是很好的保持了波形奥此。(MP3確實很厲害弧哎,只是原始數(shù)據(jù)的1/10不到,但是損失很兄苫ⅰ3纺邸)
8k采樣率的MP3
前面用ffmpeg
默認生成的mp3文件的采樣率是44.1k,而且按照mp3的規(guī)范我們知道不同采樣率會對應不同的版本和層蠢终,那么ffmpeg
是否能生成一個采樣率是電話系統(tǒng)常用的8k采樣率的mp3序攘?
ffmpeg -lavfi sine -t 10 -ar 8000 -f mp3 -c:a mp3 sine-8k-10s.mp3
文件的大小為10413
字節(jié)茴她,小了很多。
首幀的頭為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
丈牢,對應的是MPEG version2.5
;層域(C)的值是01
瞄沙,對應的是Layer3
己沛;比特率域(E)的值是0011
,對應的是24kbps
距境;采樣率域(F)的值是10
申尼,對應的是8000
。
從這個結(jié)果看垫桂,我們可以將從電話系統(tǒng)收到的8k音頻數(shù)據(jù)保存為8k的mp3文件师幕。
RTP音頻流
ffmpeg -lavfi sine -f rtp rtp://127.0.0.1:5005
注意這時輸出的sdp
信息,payload type
的值是97
诬滩,對應的參數(shù)是PCMU/44100/1
霹粥,含義是編碼格式PCMU
,采樣率44100
疼鸟,單聲道后控。
下面改變一下輸出的參數(shù):
ffmpeg -lavfi sine -ar 8000 -c:a pcm_alaw -f rtp rtp://127.0.0.1:5005
前面提到過8
是預定義的媒體類型,對應的是pcma/8000/1
愚臀。
下面我們通過wireshark
抓包看一下通過RTP傳送的數(shù)據(jù)什么樣忆蚀。執(zhí)行如下命令 矾利,啟動nc
監(jiān)聽端口5005
姑裂,ffmpeg
向端口發(fā)送RTP包(直接用過濾器生成波形無法控制播放速率,導致收到的結(jié)果不爭取男旗,所以改成播放生成好的文件舶斧,添加-re
參數(shù)播放速率),啟動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)選中一個UDP的格子:
下面我們查看一幀RTP數(shù)據(jù)的內(nèi)部:
由上兩圖可以看到茴厉,RTP Payload
中的數(shù)據(jù)和原始alaw
文件中數(shù)據(jù)完全一致,說明Payload中的數(shù)據(jù)是Payload type
指定的格式什荣。Payload的大小是320字節(jié)矾缓,也就是攜帶了320個采樣,也就是0.0.4秒的時長稻爬。 前面提到過嗜闻,Payload的大小受MTU的限制,所以ffmpeg
發(fā)送數(shù)據(jù)時會控制每個RTP包中包含的采樣數(shù)桅锄。
參考資料
RTP: A Transport Protocol for Real-Time Applications
RTP Profile for Audio and Video Conferences with Minimal Control