Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android mediacodec aac编码器的错误PTS值_Android_Encoding_Android Mediacodec_Aac - Fatal编程技术网

Android mediacodec aac编码器的错误PTS值

Android mediacodec aac编码器的错误PTS值,android,encoding,android-mediacodec,aac,Android,Encoding,Android Mediacodec,Aac,我正在尝试用媒体编解码器对音频流进行转码,在我尝试用VLC播放之前,一切看起来都很好。音频每隔几秒钟就会停止,当我看到警告时,vlc告诉我“播放方式太早(-141928):播放静音”或“播放方式太迟”。在查看vlc源代码后,我成功地跟踪了问题,漂移(在接收到的pts和期望值之间)太高/太低,因此它一定是pts问题 我查看了解码器的输入时间戳,它们很好,但是,编码器的输出时间戳不是,有时pts差异(当前编码的音频样本和最后一个样本之间)是1890,有时是2090。如果我手动设置pts(通过在每个样

我正在尝试用媒体编解码器对音频流进行转码,在我尝试用VLC播放之前,一切看起来都很好。音频每隔几秒钟就会停止,当我看到警告时,vlc告诉我“播放方式太早(-141928):播放静音”或“播放方式太迟”。在查看vlc源代码后,我成功地跟踪了问题,漂移(在接收到的pts和期望值之间)太高/太低,因此它一定是pts问题

我查看了解码器的输入时间戳,它们很好,但是,编码器的输出时间戳不是,有时pts差异(当前编码的音频样本和最后一个样本之间)是1890,有时是2090。如果我手动设置pts(通过在每个样本中增加2090),我成功地使其正常工作

目前我不知道为什么aac编码器pts值不正确,有什么建议吗? 我注意到另一个奇怪的行为:在配置编解码器时,这种情况只发生在采样率的某些值上。以下是用于配置编解码器的代码:

MediaFormat formatAudio = MediaFormat.createAudioFormat("audio/mp4a-latm", 44100, 2);   // AAC Low Overhead Audio Transport Multiplex
formatAudio.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
formatAudio.setInteger(MediaFormat.KEY_BIT_RATE, 64000);
formatAudio.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE,655360); 
ByteBuffer csd = ByteBuffer.allocate(2);
csd.put(0, (byte) (2 << 3 | 4 >> 1));
csd.put(1, (byte)((4 & 0x01) << 7 | 2 << 3));
formatAudio.setByteBuffer("csd-0", csd);
MediaFormat formatAudio=MediaFormat.createAudioFormat(“音频/mp4a latm”,44100,2);//AAC低开销音频传输多路复用
formatAudio.setInteger(MediaFormat.KEY_AAC_PROFILE,MediaCodecInfo.codecoprofilelevel.AACObjectLC);
formatAudio.setInteger(MediaFormat.KEY\u比特率,64000);
formatAudio.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE,655360);
ByteBuffer csd=ByteBuffer.allocate(2);
csd.put(0,(字节)(2>1));

csd.put(1,(字节)((4&0x01)原始采样率是多少?仅当您转码44.1khz->44.1khz而不是48khz->48khz时,您是否遇到此问题?MediaCodec不会为您重新采样。很抱歉让您回复。原始采样率是48khz,我正在尝试重新采样到44.1khz,我不希望我必须手动重新采样音频。我理解为什么需要重新采样o重新采样视频(转码时),因为我们试图将一帧渲染成更小/更大的曲面,但为什么我们还需要(也)重新采样音频?我们正在尝试编码的不是原始音频数据吗?它是如何工作的?原始采样率是多少?只有在您转码44.1khz->44.1khz而不是48khz->48khz时,您是否遇到此问题?MediaCodec不会为您重新采样。很抱歉,让您回复。原始采样率是48khz,我正在尝试重新采样采样到44.1khz,我没想到我必须手动重新采样音频。我理解为什么我需要重新采样视频(转码时),因为我们试图将一帧渲染成更小/更大的表面,但为什么我们需要(也)重新采样音频?我们试图编码的不是原始音频数据吗?它是如何工作的?