当使用音频队列播放从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,它总是可以正常工作!

08-25 07:35