VLC-Android音频播放不完整问题踏坑

对于音频播放异常的问题,由于我们可以拿到解码前后的数据,因此还是比视频播放异常的问题好分析一些的。通过dump解封装后的es数据和解码后的pcm数据,我们可以快速的定位问题出现的大致位置:demux,decoder,aout。本题也是一样,先dump es和pcm数据,发现都没有问题,那基本就是aout部分惹的祸了。

通过加日志,发现在音频播放快结束的时候,aout调用了两次flush。全局搜索aout_DecFlush函数,发现有三种情况下会调用:1.decoder flush;2.decoder delete;3.decoder drain。decoder flush一般都是发生在seek操作后,本问题是自然播放到音频结束,所以两次aout_DecFlush应该是先后发生在decoder drain(消耗解码器缓存)和decoder delete(销毁解码器)中,后续通过加日志也印证了我们的猜测。我们看下aout_DecFlush具体做了啥:

//这里aout_DecFlush还有一个布尔参数wait,只有在decoder drain的时候将wait为true

void aout_DecFlush (audio_output_t *aout, bool wait)

{

    aout_owner_t *owner = aout_owner (aout);

    aout_OutputLock (aout);

    owner->sync.end = VLC_TS_INVALID;

    if (owner->mixer_format.i_format)

    {

        //如果wait为true,会先将filter中的block播放完

        if (wait)

        {

            block_t *block = aout_FiltersDrain (owner->filters);

            if (block)

                aout_OutputPlay (aout, block);

        }

        else

            aout_FiltersFlush (owner->filters);

        //flush aout

        aout_OutputFlush (aout, wait);

    }

    aout_OutputUnlock (aout);

}

这里可以看到,无论wait是否为true,最终都会调用aout_OutputFlush。如果wait为true,就先把没播放完的音频播放完后再flush。那么问题来了,aout_OutputPlay真的能保证音频全部播放完成吗?答案显然是否定的,不然也就不会出现问题了,我们看下audiotrack.c的Play函数:

static void

Play( audio_output_t *p_aout, block_t *p

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值