Android 三星手机中的 AudioTrack 出现奇怪的噪音
Android AudioTrack weird noise in Samsung Mobile
我的 Android 应用程序使用 MediaCodec 解码音频流并使用 AudioTrack 播放它。在使用 Dell Venue 3830(Intel 处理器,Kitkat OS)进行测试时,它播放正常,但是在使用 Samsung GT-S7582(Armv7 处理器,JellyBean OS)进行测试时,它会产生奇怪的噪音。有什么办法可以克服这种噪音吗?
Mediacodec 解码器配置
String mimeType = "audio/3gpp";
AudioDecoder = MediaCodec.createDecoderByType(mimeType);
MediaFormat mMediaFormat = new MediaFormat();
mMediaFormat = MediaFormat.createAudioFormat(mimeType,sampleRate,1);
AudioDecoder.configure(mMediaFormat,null, null, 0);
AudioDecoder.start();
音轨配置
mAudioTrack = new AudioTrack(
AudioManager.STREAM_VOICE_CALL,
sampleRate,
AudioFormat.CHANNEL_OUT_MONO ,
AudioFormat.ENCODING_PCM_16BIT,
AudioTrack.getMinBufferSize(8000,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT)*8,
AudioTrack.MODE_STREAM);
一般来说,您可能只想在从解码器获得 INFO_OUTPUT_FORMAT_CHANGED
后设置 AudioTrack
,并使用来自 MediaCodec.getOutputFormat
的 MediaFormat
的信息设置参数。例如。对于 AAC,即使文件本身是单声道,一些解码器也可以将其解码为立体声。 (但这不会产生很大的噪音,只会让它听起来慢两倍。)
由于您正在解码 AMR-NB,而不是 AAC,因此它可能不会以立体声返回,但您可能仍想检查输出 MediaFormat
以查看解码器是否以某种意外格式返回数据.
您也可以使用 MediaCodecList
寻找另一个解码器,而不是依赖 MediaCodec.createDecoderByType
只选择第一个解码器。在大多数设备上,都有 google 软件解码器,但有些设备也可以有一个硬件解码器,这可能会有所不同。通过手动遍历列表并优先选择以 OMX.google
开头的列表(例如 OMX.google.amrnb.decoder
在您的情况下),您可能会获得更可预测的行为。 (对于视频,人们通常不想使用 SW 编解码器,除非它们是唯一的选择,因为两者之间的性能存在巨大差异,但对于音频,在大多数情况下差异应该不会太大。)
我的 Android 应用程序使用 MediaCodec 解码音频流并使用 AudioTrack 播放它。在使用 Dell Venue 3830(Intel 处理器,Kitkat OS)进行测试时,它播放正常,但是在使用 Samsung GT-S7582(Armv7 处理器,JellyBean OS)进行测试时,它会产生奇怪的噪音。有什么办法可以克服这种噪音吗?
Mediacodec 解码器配置
String mimeType = "audio/3gpp";
AudioDecoder = MediaCodec.createDecoderByType(mimeType);
MediaFormat mMediaFormat = new MediaFormat();
mMediaFormat = MediaFormat.createAudioFormat(mimeType,sampleRate,1);
AudioDecoder.configure(mMediaFormat,null, null, 0);
AudioDecoder.start();
音轨配置
mAudioTrack = new AudioTrack(
AudioManager.STREAM_VOICE_CALL,
sampleRate,
AudioFormat.CHANNEL_OUT_MONO ,
AudioFormat.ENCODING_PCM_16BIT,
AudioTrack.getMinBufferSize(8000,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT)*8,
AudioTrack.MODE_STREAM);
一般来说,您可能只想在从解码器获得 INFO_OUTPUT_FORMAT_CHANGED
后设置 AudioTrack
,并使用来自 MediaCodec.getOutputFormat
的 MediaFormat
的信息设置参数。例如。对于 AAC,即使文件本身是单声道,一些解码器也可以将其解码为立体声。 (但这不会产生很大的噪音,只会让它听起来慢两倍。)
由于您正在解码 AMR-NB,而不是 AAC,因此它可能不会以立体声返回,但您可能仍想检查输出 MediaFormat
以查看解码器是否以某种意外格式返回数据.
您也可以使用 MediaCodecList
寻找另一个解码器,而不是依赖 MediaCodec.createDecoderByType
只选择第一个解码器。在大多数设备上,都有 google 软件解码器,但有些设备也可以有一个硬件解码器,这可能会有所不同。通过手动遍历列表并优先选择以 OMX.google
开头的列表(例如 OMX.google.amrnb.decoder
在您的情况下),您可能会获得更可预测的行为。 (对于视频,人们通常不想使用 SW 编解码器,除非它们是唯一的选择,因为两者之间的性能存在巨大差异,但对于音频,在大多数情况下差异应该不会太大。)