通过网上的知识了解到,pcm这种的源数据要通过audioTrack来进行播放
C++层通过aar提供了回调方法给我大概如下,通过了通道和还有码流等,但是我播出来的就是有噪音,不知道是不是我的用法有个问题,decodeFrame.data是音频的byet数据,这个回调方法一直给我回调音频的byet数据,我通过下面方式进行播放是噪音像电报一样。应该是我的方法有问题,请问下有没有了解的帮忙看下,感谢!
@Override
public void onMediaDecodeFrameDataCallback(long l, @Nullable MediaSdk.DecodeFrame decodeFrame, long l1) {
if (Objects.requireNonNull(decodeFrame).data != null) {
Log.e(TAG, "decodeFrame" + decodeFrame.decodeType);
Log.e(TAG, "audioChannel" + decodeFrame.metaInfo.audioChannel);
Log.e(TAG, "audioEnable" + decodeFrame.metaInfo.audioEnable);
Log.e(TAG, "audioEncType" + decodeFrame.metaInfo.audioEncType);
Log.e(TAG, "audioSampleBit" + decodeFrame.metaInfo.audioSampleBit);
Log.e(TAG, "audioSampleRate" + decodeFrame.metaInfo.audioSampleRate);
int minBufferSize = AudioTrack.getMinBufferSize(
decodeFrame.metaInfo.audioSampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audioTrack = new AudioTrack.Builder()
//1、setAudioAttributes:AudioAttributes 实例,不能为空
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)//setUsage 设置 AudioTrack 的使用场景;
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//setContentType 设置输入的音频文件内容的类型;
.build())
//2、setAudioFormat:AudioFormat是咧 用于描述播放的数据格式,AudioFormat 中包含了编码
//格式,声道和采样率等,不能为空
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)//采样格式
.setSampleRate(decodeFrame.metaInfo.audioSampleRate)//设置采样率
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)//设置声道
.build())
//3、setTransferMode:int模式二选一 MODE_STATIC 与 MODE_STREAM
.setTransferMode(AudioTrack.MODE_STREAM)
//4、setBufferSizeInBytes:int: 用于读取音频数据的内部缓冲区的总大小(以byte为单位)。
//如果 mode 是 MODE_STATIC ,其为音频最大长度;
//如果是 MODE_STREAM ,其值要大于等于接收流的最小缓冲区大小,建议使用 getMinBufferSize(int, int, int) 方法来估算 AudioTrack的实例在流模式下的最小缓冲区大小
.setBufferSizeInBytes(minBufferSize)
.build();
if (audioTrack!=null&&audioTrack.getState()!= AudioTrack.STATE_UNINITIALIZED && audioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING){
audioTrack.play();
Log.e(TAG,"开始播放");
// audioTrack.write(decodeFrame.data, 0, minBufferSize, AudioTrack.WRITE_BLOCKING);
}
}
}
解决了,是因为上传给的decodeFrame.data,包含视频和音频数据,没有过滤视频的byet数据
很久之前搞过都忘记了,是不是采样问题,设置不同码率试试