欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android手机通过rtp发送aac数据给vlc播放的实现步骤

程序员文章站 2022-05-14 21:04:03
截屏audiorecord音频采集音频采集时需要设置采集参数,设置的这些参数需要与创建mediacodec时的参数一致。 samplerate是采样率:44100 channelcount...

截屏

Android手机通过rtp发送aac数据给vlc播放的实现步骤

audiorecord音频采集

音频采集时需要设置采集参数,设置的这些参数需要与创建mediacodec时的参数一致。

  • samplerate是采样率:44100
  • channelcount是通道数:1
  • 单个采样数据大小格式:audioformat.encoding_pcm_16bit
  • 最小数据buffer:audiorecord.getminbuffersize()计算获取

这里采用的阻塞的方式采集数据,所以audiorecord依据设置的采样频率生成数据的,我们可以直接把当前的时间设置为录制的时间戳。

mediacodec编码音频数据

为mediacodec创建mediaformat并设置参数,这里设置的音频参数必须与audiorecord一致。

  • mime_type:"audio/mp4a-latm"
  • 采样频率与audiorecord一致:44100
  • 通道数与audiorecord一致:1
  • key_aac_profile配置为低带宽要求类型:aacobjectlc
  • key_bit_rate设置的大小影响编码压缩率:128 * 1024

给mediacodec传数据的时候设置的时间戳是当前的系统时间,由于我们使用rtp发送实时数据,所以flag不需要设置结束标志。

从mediacodec读出的是aac原始的数据,我们可以根据具体的需求来决定是否添加au header发送。这里实现了有au header和没有 au header两种方案。没有au header的情况我们直接把mediacode读出的数据通过rtp发送出去。有au header的情况我们需要在原始的aac数据前面追加4个字节的au header。是否有au header与vlc播放的sdp内容有关。后面会详解介绍sdp内容的设置。

  • au header length占用两个字节,它会描述au header的大小,这里设置为2.
  • au header 占用两个字节,它描述了aac原始数据的大小,这里需要根据mediacodec返回的aac原始数据大小进行设置。

rtp发送数据

我们使用jrtplib库来发送数据,这里对库进行简单的封装并提供了java封装类rtpwrapper。

open方法要指定发送数据使用的端口,payloadtype设置载体类型,samplerate是采样率。
adddestinationip用于添加接收端ip地址,地址格式: "192.168.1.1"。
senddata方法用于发送数据,increase是时间间隔,时间单位是 samplerate/秒

mediacodec返回format的时候创建rtp连接并指定目的地址。

发送数据的时候需要指定payloadtype,距离上次发送数据的时间间隔等信息。
(info.presentationtimeus - lastsendaudiotime)计算的是以微妙为单位的时间间隔。
(info.presentationtimeus - lastsendaudiotime) * audiosamplerate / 1000 / 1000转换成samplerate/秒为单位的时间间隔。
rtp发送aac数据使用的payloadtype为97。

sdp文件配置

vlc播放器播放rtp音频数据时需要指定sdp文件,它通过读取sdp文件中的信息可以了解rpt接收端口、payloadtype类型、音频的格式等信息用于接收数据流并解码播放。这里有两种配置方式用于支持有au header和没有au header的情况。

  • 有au header
  • 没有au header

sdp文件配置了端口号为40020, rtp payload type为97,音频的采样率为44100、通道数为1。

音频config配置计算方式:

Android手机通过rtp发送aac数据给vlc播放的实现步骤

比较有au header和没有au header的两个版本,发现它们的区别在于是否配置了sizelength和indexlength。

我这里的au header是两个字节的,sizelength为13代表占用了13bit,indexlength为3代表占用3bit。配合发送数据时添加au header的代码就容易理解了。

vlc测试播放

  1. vlc打开工程目录下的play_audio.sdp/play_audio_auheader.sdp 。
  2. 启动android应用指定运行vlc的电脑的ip地址。
  3. 开始录制,如何vlc打开的是play_audio_auheader.sdp,那么在开始录制前需要选中auheader check box

总结

  1. audiorecord的设置信息与mediacodec的配置信息必须一致。
  2. audiorecord采用block的方式读取数据,这样我们可以直接使用系统时间来配置encode时间戳。
  3. 是否需要添加au header与sdp配置有关,vlc播放器会按照sdp配置解析au header。
  4. sdp中的config需要按照实际的音频配置信息计算得出,否则不能正常播放。

工程git地址

https://github.com/mjlong123123/audiorecorder

以上就是android手机通过rtp发送aac数据给vlc播放的实现步骤的详细内容,更多关于android rtp发送aac数据给vlc播放的资料请关注其它相关文章!