iOS使用OpenAL播放音视频不同步的问题

2022-08-25  本文已影响0人  星星杨

概述:
最近在做的项目,涉及用FFmpeg解码视频,在本地APP播放的功能,测试同学反应播放视频音视频不同步,所以就浅浅的记录一下解决过程;

1、分析

音视频不同步主要分为三种情况:

1、拉取源视频音画就不同步
2、解码过程中音频帧跟视频帧的时间戳处理不当导致音画不同步
3、最后一个就是音频播放队列缓存太长,导致不同步

第一点通过第三方软件可以正常播放视频源,所以排除;
第二点之前分析过,通过音视频解码的pts来比较音视频帧的延迟与否,采用的策略是视频帧向音频帧对齐的方式,即保证音频帧流畅输出;
所以排除以上两点问题,就把重点排查的范围确定到第三点上;

2、排查问题

调试追踪发现,queue队列长度确实容易飙升,有时候都能达到一百多,按1秒25帧来算,音频可能会滞后3-4秒,甚至更多 image.png

3、改进措施

控制播放队列长度为10,在把解码得到音频帧加入音频队列之前,先判断当前缓存队列长度是否超过最大程度,如果未超过就可以正常添加,否则解码线程就休眠等待;

    int dataSize = frame->nb_samples * frame->channels * av_get_bytes_per_sample(AVSampleFormat(frame->format));
    std::this_thread::sleep_for(std::chrono::milliseconds(44100/dataSize));
    // 异步渲染
    #warning TODO 卡顿之后就会造成音频延时 -- 已解决
//    BOOL addSuccess = YES;
    char *data = (char *)frame->data[0];
    BOOL ret = NO;
    while (!ret) {
        ret = [self.audioPlayer openAudioFromQueue:data withLength:dataSize];
        if(!ret) {
            /// 休眠一毫秒
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
        }
    }
image.png

以上简单处理,可以解决当前音频延迟严重的问题,只是草草记录一下部分问题点,未做详细说明,如对您有帮助,深感荣幸!!!

上一篇 下一篇

猜你喜欢

热点阅读