当使用音频队列播放从ffmpeg解码的lpcm数据时,AudioQueueGetCurrentTime
获得的经过时间超过了媒体的持续时间。但是,当使用AVFoundation框架解码同一媒体时,经过的时间等于媒体的持续时间,因此,当通过ffmpeg读取未解码的媒体,然后将压缩的媒体数据发送到音频队列时,经过的时间也等于媒体的持续时间。 AudioStreamBasicDescription 设置如下:
asbd.mSampleRate = 44100;
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kAudioFormatFlagsCanonical;
asbd.mBytesPerPacket = 4;
asbd.mFramesPerPacket = 1;
asbd.mBytesPerFrame = 4;
asbd.mChannelsPerFrame = 2;
asbd.mBitsPerChannel = 16;
asbd.mReserved = 0;
当播放从AVFoundation解码的数据时, AudioStreamBasicDescription 的设置与上述相同。通过我的测试发现,ffmpeg和AVFoundation之间由
AudioTimeStamp.mSampleTime
获得的AudioQueueGetCurrentTime
是不同的,ffmpeg的值大于AVFoundation。所以我想知道这种情况如何发生,以及如何解决?谢谢!
最佳答案
这里的错误是asbd.mSampleRate = 44100
并不总是正确的,因此有时结果是正确的,但其他错误。然后,您应该设置asbd.mSampleRate = audioCodecCtx->sample_rate
,它总是可以正常工作!