美文网首页
iOS使用OpenAL播放音视频不同步的问题

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

作者: 克里斯star | 来源:发表于2022-08-25 15: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

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

    相关文章

      网友评论

          本文标题:iOS使用OpenAL播放音视频不同步的问题

          本文链接:https://www.haomeiwen.com/subject/hnwggrtx.html