AAC(adts头)转PCM

mash5_paul 2020-12-01 06:15:52
目前开发1078遇到如下问题,终端采集上来的音频为AAC(带ADTS头)的格式,然而内部统一需要转成pcm格式
现需要把AAC转成PCM。
目前使用的jaad-0.8.4.jar,第三方的包进行转码,浓缩代码如下:

final byte[] decoderSpecificInfo = new byte[] { (byte) (0x15 & 0xFF), (byte) (0x88 & 0xFF) };
final Decoder dec = new Decoder(decoderSpecificInfo);
byte[] frame = HexStringUtil.HexString2Bytes( "012434204c24315904c280b0dcdddc4bcd52a045402010b0673863abf7ec4b4d4d49c419d5fa3002d55b3c4b7209fb9b4762dd1116a41516108ca26f554885b0dd271ad08e7350052f0ac3023ba2519d0f746f2ea90c7824458800e9f1ef950a544106f9e63204c1002484efcf9e7bfd0ad7391c9e641ba9f0032e31b10407409ab5441839c9f3a62bb7852ae72b2dc0df1d7ec6b844026515c277ca8167bea6aa72bc7bd2cb1e788b688cc84f3cc6ea3b1654efda0e4ce19d310208499b71c76391f7208840f22cca7984e5ced060927a7497a27582d837dbb490a73b5bb30f59c51765cfbb47423bb2d8282f198a813122b9aa95d40211d7cf4ddded2c58a070113942aadd38130918c018000970");
SampleBuffer buf = new SampleBuffer();
dec.decodeFrame(frame, buf);
byte[] pcm = buf.getData();
System.out.println("len= " + pcm.length + ",PCM码= " + HexStringUtil.bytesToHexString(pcm, false));

...全文
22060 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mash5_paul 2021-03-01
  • 打赏
  • 举报
回复
这是固定写法,具体啥含义,母鸡。 有事件了,继续整这玩意
  • 打赏
  • 举报
回复
引用 7 楼 mash5_paul 的回复:
[quote=引用 6 楼 这是一个正经昵称 的回复:][quote=引用 5 楼 mash5_paul 的回复:]使用场景,在做1078视频服务平台。G711A的目前可解码成PCM,AAC的出现问题。咱也不是专门搞音视频码流的,里面音视频协议也比较懵
我搞过的显然和你的也不一样,但是编解码应该相差不会太多。 G711数据是可以拿一帧数据直接经过换算得到PCM数据的,PCM长度会变2倍。 ffmpeg中,AAC不能直接拿无头数据解码的,ADTS头里有采样率、通道、单数据长度等东西的,是一个按位存储的结构体,可以查一下。用ffmpeg解码rtsp流中的aac播放的时候,需要先把RTP包解出来,然后把ADTS头加回去再去解码,解码后的PCM肯定比原长大的。只能提供参考,你这个库我也没玩过,不太清楚[/quote] G711A转pcm是原来的两倍,AAC转PCM这个库转出来竟然固定长,1024。 RTP包传上来就带ADTS头的,我试了带ADTS头和不带ADTS头,带ADTS头用库转换后无数据了。不带ADTS头变成1024[/quote] 我也没用过这个库,不清楚接口是怎样的。按你的说法,别的先不管,初始化解码器有没有初始化正确? new byte[] { (byte) (0x15 & 0xFF), (byte) (0x88 & 0xFF) }; 的含义是?
mash5_paul 2020-12-09
  • 打赏
  • 举报
回复
引用 6 楼 这是一个正经昵称 的回复:
[quote=引用 5 楼 mash5_paul 的回复:]使用场景,在做1078视频服务平台。G711A的目前可解码成PCM,AAC的出现问题。咱也不是专门搞音视频码流的,里面音视频协议也比较懵
我搞过的显然和你的也不一样,但是编解码应该相差不会太多。 G711数据是可以拿一帧数据直接经过换算得到PCM数据的,PCM长度会变2倍。 ffmpeg中,AAC不能直接拿无头数据解码的,ADTS头里有采样率、通道、单数据长度等东西的,是一个按位存储的结构体,可以查一下。用ffmpeg解码rtsp流中的aac播放的时候,需要先把RTP包解出来,然后把ADTS头加回去再去解码,解码后的PCM肯定比原长大的。只能提供参考,你这个库我也没玩过,不太清楚[/quote] G711A转pcm是原来的两倍,AAC转PCM这个库转出来竟然固定长,1024。 RTP包传上来就带ADTS头的,我试了带ADTS头和不带ADTS头,带ADTS头用库转换后无数据了。不带ADTS头变成1024
  • 打赏
  • 举报
回复
我是搞c/c++的,见谅。看你的解码器应该也初始化参数了,不知是出什么问题?
  • 打赏
  • 举报
回复
大佬们可能都不在吧 AAC解码PCM,解码器又不配置通道数、采样率、位深,那ADTS头就是唯一的信息来源了,你是解不出来吗还是?分析下ADTS头对不对,或者干脆用一个正常的aac文件先测试一下
  • 打赏
  • 举报
回复
引用 5 楼 mash5_paul 的回复:
使用场景,在做1078视频服务平台。G711A的目前可解码成PCM,AAC的出现问题。咱也不是专门搞音视频码流的,里面音视频协议也比较懵
我搞过的显然和你的也不一样,但是编解码应该相差不会太多。 G711数据是可以拿一帧数据直接经过换算得到PCM数据的,PCM长度会变2倍。 ffmpeg中,AAC不能直接拿无头数据解码的,ADTS头里有采样率、通道、单数据长度等东西的,是一个按位存储的结构体,可以查一下。用ffmpeg解码rtsp流中的aac播放的时候,需要先把RTP包解出来,然后把ADTS头加回去再去解码,解码后的PCM肯定比原长大的。只能提供参考,你这个库我也没玩过,不太清楚
mash5_paul 2020-12-08
  • 打赏
  • 举报
回复
使用场景,在做1078视频服务平台。G711A的目前可解码成PCM,AAC的出现问题。咱也不是专门搞音视频码流的,里面音视频协议也比较懵
mash5_paul 2020-12-08
  • 打赏
  • 举报
回复
引用 2 楼 这是一个正经昵称 的回复:
大佬们可能都不在吧 AAC解码PCM,解码器又不配置通道数、采样率、位深,那ADTS头就是唯一的信息来源了,你是解不出来吗还是?分析下ADTS头对不对,或者干脆用一个正常的aac文件先测试一下
frame是去了ADTS头的,转出来的pcm为1024,远远大于AAC的流长度了。 具体ADTS头没研究,【fff96c401ebffc】这是ADTS头
mash5_paul 2020-12-07
  • 打赏
  • 举报
回复
不能沉啊

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧