做编解码的东西,总会用到ffmpeg。目前使用的是ffmpeg-3.2.2版本。使用libfdk-aac对aac进行编解码。编译的要开启–enable-libfdk-aac参数。
发送AAC
./ffmpeg -re -i Adele.mp3 -vn -c:a libfdk_aac -flags +global_header -ar 16k -f rtp rtp://127.0.0.1:5000 -v 56 v=0 o=- 0 0 IN IP4 127.0.0.1 s=You'll Never See Me Again c=IN IP4 127.0.0.1 t=0 0 a=tool:libavformat 57.56.100 m=audio 5000 RTP/AVP 97 b=AS:46 a=rtpmap:97 MPEG4-GENERIC/16000/2 a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1410
-ar参数指定为16k的音质。而如果没有带-flags +global_header则会报以下的错误:
[rtp @ 0x3c836e0] AAC with no global headers is currently not supported.
如果想要是单声道。则可以带上参数-ac 1
./ffmpeg -re -i Adele.mp3 -vn -c:a libfdk_aac -flags +global_header -ar 16k -ac 1 -f rtp rtp://127.0.0.1:5000 -v 56 v=0 o=- 0 0 IN IP4 127.0.0.1 s=You'll Never See Me Again c=IN IP4 127.0.0.1 t=0 0 a=tool:libavformat 57.56.100 m=audio 5000 RTP/AVP 97 b=AS:34 a=rtpmap:97 MPEG4-GENERIC/16000/1 a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1408
其实AAC可以负载在两种RFC协议中,以上这些配置,使用的是RFC3640 (MPEG4-GENERIC的rtpmap);还有可以基于RFC3016,也就是LATM(MP4A-LATM的rtpmap)。ffmpeg也是支持的,要带上RTP参数:
./ffmpeg -re -i Adele.mp3 -vn -c:a libfdk_aac -flags +global_header -ar 16k -rtpflags latm -f rtp rtp://127.0.0.1:5000 -v 56 v=0 o=- 0 0 IN IP4 127.0.0.1 s=You'll Never See Me Again c=IN IP4 127.0.0.1 t=0 0 a=tool:libavformat 57.56.100 m=audio 5000 RTP/AVP 97 b=AS:46 a=rtpmap:97 MP4A-LATM/16000/2 a=fmtp:97 profile-level-id=40;cpresent=0;config=400028203fc0
当前还有一些其余的参数可以配置,暂时不对一些细节参数说明,可以去查一查ffmpeg或者直接阅读ffmpeg的代码(个人比较喜欢直接阅读代码)。
接收AAC
由于ffmpeg在发送RTP的时候,都会输出SDP信息,我们可以将SDP信息复制到文件。这时候,我们使用A终端接收SDP的内容,用B终端发送RTP流。并且使用wireshark抓包(或tcpdump),就可以将AAC的RTP报文抓取下来。
./ffmpeg -protocol_whitelist file,udp,rtp -i aac.sdp -v 56 aac.wav
其中,目前3.2.2版本,需要带上-protocol_whitelist file,udp,rtp参数字段,否则会报一下错误:
[rtp @ 0x394abc0] Protocol not on whitelist 'file,crypto'!
参考资料:
streaming webcam via rtp protocol
AAC with no global headers is currently not supported.
转载请注明: 转载自elkPi.com
本文链接地址: ffmpeg发送AAC及接收AAC