Android --- IjkPlayer 阅读native层源码之如何将AvPacket数据解码出一帧数据(六)

本文详细介绍IjkPlayer中音频线程如何将AvPacket解码为音频帧,并处理解码后的帧数据,包括同步校验及缓存管理。

整章目录:Android------- IjkPlayer 源码学习目录

本篇会有很多源代码,请注意阅读每行代码上面的注释。

本篇介绍的主要内容为上图红框圈起部分:

先简单介绍IjkPlayer中AvPacket是如何获取的???

在ff_ffplay.c的read_thread线程,会循环的调用av_read_frame函数,不停的从流中获得AvPacket数据。并且read_thread线程还会创建4个子线程:audio_thread、video_thread、subtitle_thread、aout_thread,而前三个线程的功能:分别将音频、视频、字幕三个类型的AvPacket数据解码为Frame(帧数据)。所以本篇内容将聊这三个线程之一:audio_thread。(三个线程流程都一样,举一反三)

补充视频解码:Android --- IjkPlayer 阅读native层源码之将AvPacket解码为一帧视频(八)补充

如果想知道read_thread线程如何创建4个子线程的请看:Android ---- Ijkplayer阅读native层源码之IjkMediaPlayer_prepareAsync


audio_thread:

static int audio_thread(void *arg)
{
 
    //循环
    do {
        // 将音频队列的存储个数、大小、和音频能播放多长时间这些信息存入,用于UI展示 
        // FFPlayer.stat.audio_cache
        ffp_audio_statistic_l(ffp);

        // 注意:
        // 将缓存队列中一个AVPacket数据解码为Frame数据,解码出来的最新一帧存放在frame中。解码成功返回 1
        if ((got_frame = decoder_decode_frame(ffp, &is->auddec, frame, NULL)) < 0)
     

        // 解码一帧成功
        if (got_frame) {
                tb = (AVRational){1, frame->sample_rate};
                // 如果开启了音视频精准同步校验,拖动进度条后,第一帧数据才会去校验,默认关闭
                if (ffp->enable_accurate_seek && is->audio_accurate_seek_req && !is->seek_req) {
                    // 获得该帧的显示时间
                    frame_pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(tb);
                    now = av_gettime_relative() / 1000;
                    if (!isnan(frame_pts)) {
                        // 计算该帧播放时间
                        samples_duration = (double) frame->nb_samples / frame->sample_rate;
                        // 计算播放完该帧的实际时间
                        audio_clock = frame_pts + samples_duration;
                        //
                        is->accurate_seek_aframe_pts = audio_clock * 1000 * 1000;
                        // 拿到当前播放的进度条值----播放时间
                        audio_seek_pos = is->seek_pos;
                        // 计算解码音频帧的显示完成时间与此时的进度条对应时间值相减,即显示完该帧后,进度条需要前进多少时间
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值