欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何進(jìn)行分析FFmpegffplay

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何進(jìn)行分析FFmpeg ffplay,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元盤龍做網(wǎng)站,已為上家服務(wù),為盤龍各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

代碼堆棧回溯


  ffplayd.exe!video_image_display(VideoState * is) 行 1036 C
  ffplayd.exe!video_display(VideoState * is) 行 1371 C
  ffplayd.exe!video_refresh(void * opaque, double * remaining_time) 行 1690 C
  ffplayd.exe!refresh_loop_wait_event(VideoState * is, SDL_Event * event) 行 3229 C
  ffplayd.exe!event_loop(VideoState * cur_stream) 行 3269 C
  ffplayd.exe!main(int argc, char * * argv) 行 3768 C

調(diào)用 SDL_RenderCopyEx(renderer, is->vid_texture, NULL, &rect, 0, NULL, vp->flip_v ? SDL_FLIP_VERTICAL : 0)實(shí)現(xiàn)界面的渲染
渲染的時(shí)機(jī)非常重要

1)refresh_loop_wait_event函數(shù)剖析

static void refresh_loop_wait_event(VideoState *is, SDL_Event *event) {
    double remaining_time = 0.0;
   //調(diào)用該函數(shù)搜集輸入設(shè)備的事件(例如鍵盤輸入,鼠標(biāo)移動(dòng)),然后存放在事件隊(duì)列中,等待SDL_PeepEvents獲取事件
    SDL_PumpEvents();
  //SDL_GETEVENT操作指定的SDL_PeepEvents會(huì)讀取事件隊(duì)列中的事件消息,并且是將讀取的事件移除出隊(duì)列
  //while循環(huán)!說(shuō)明了只要事件隊(duì)列有消息,優(yōu)先執(zhí)行隊(duì)列中的事件,然后才進(jìn)行視頻的渲染
    while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {
        if (!cursor_hidden && av_gettime_relative() - cursor_last_shown > CURSOR_HIDE_DELAY) {
            SDL_ShowCursor(0);
            cursor_hidden = 1;
        }
        if (remaining_time > 0.0)
            av_usleep((int64_t)(remaining_time * 1000000.0));
        remaining_time = REFRESH_RATE;
        if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh))
            video_refresh(is, &remaining_time);
        //重新搜索輸入設(shè)備的事件,如果屏蔽掉該函數(shù)的調(diào)用,將會(huì)導(dǎo)致鍵盤的輸入無(wú)法進(jìn)行事件隊(duì)列,導(dǎo)致鍵盤輸入無(wú)效,例如嘗試按下q停止視頻播放
        SDL_PumpEvents();
    }
}

static void video_refresh(void *opaque, double *remaining_time)
{
    VideoState *is = opaque;
    double time;

    Frame *sp, *sp2;

    if (!is->paused && get_master_sync_type(is) == AV_SYNC_EXTERNAL_CLOCK && is->realtime)
        check_external_clock_speed(is);

   //如果不是音頻數(shù)據(jù),也就是字幕或者聲音顯示或者播放
    if (!display_disable && is->show_mode != SHOW_MODE_VIDEO && is->audio_st) {
        time = av_gettime_relative() / 1000000.0;
        if (is->force_refresh || is->last_vis_time + rdftspeed < time) {
            video_display(is);
            is->last_vis_time = time;
        }
        *remaining_time = FFMIN(*remaining_time, is->last_vis_time + rdftspeed - time);
    }

    if (is->video_st) {
retry:
        if (frame_queue_nb_remaining(&is->pictq) == 0) {
            // nothing to do, no picture to display in the queue
        } else {
            double last_duration, duration, delay;
            Frame *vp, *lastvp;

            /* dequeue the picture */
            lastvp = frame_queue_peek_last(&is->pictq);
            vp = frame_queue_peek(&is->pictq);

            if (vp->serial != is->videoq.serial) {
                frame_queue_next(&is->pictq);
                goto retry;
            }

            if (lastvp->serial != vp->serial)
                is->frame_timer = av_gettime_relative() / 1000000.0;

            if (is->paused)
                goto display;

            /* compute nominal last_duration */
            last_duration = vp_duration(is, lastvp, vp);
            delay = compute_target_delay(last_duration, is);

            time= av_gettime_relative()/1000000.0;
            if (time < is->frame_timer + delay) {
                *remaining_time = FFMIN(is->frame_timer + delay - time, *remaining_time);
                goto display;
            }

            is->frame_timer += delay;
            if (delay > 0 && time - is->frame_timer > AV_SYNC_THRESHOLD_MAX)
                is->frame_timer = time;

            SDL_LockMutex(is->pictq.mutex);
            if (!isnan(vp->pts))
                update_video_pts(is, vp->pts, vp->pos, vp->serial);
            SDL_UnlockMutex(is->pictq.mutex);

            if (frame_queue_nb_remaining(&is->pictq) > 1) {
                Frame *nextvp = frame_queue_peek_next(&is->pictq);
                duration = vp_duration(is, vp, nextvp);
                if(!is->step && (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
                    is->frame_drops_late++;
                    frame_queue_next(&is->pictq);
                    goto retry;
                }
            }

            if (is->subtitle_st) {
                    while (frame_queue_nb_remaining(&is->subpq) > 0) {
                        sp = frame_queue_peek(&is->subpq);

                        if (frame_queue_nb_remaining(&is->subpq) > 1)
                            sp2 = frame_queue_peek_next(&is->subpq);
                        else
                            sp2 = NULL;

                        if (sp->serial != is->subtitleq.serial
                                || (is->vidclk.pts > (sp->pts + ((float) sp->sub.end_display_time / 1000)))
                                || (sp2 && is->vidclk.pts > (sp2->pts + ((float) sp2->sub.start_display_time / 1000))))
                        {
                            if (sp->uploaded) {
                                int i;
                                for (i = 0; i < sp->sub.num_rects; i++) {
                                    AVSubtitleRect *sub_rect = sp->sub.rects[i];
                                    uint8_t *pixels;
                                    int pitch, j;

                                    if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)&pixels, &pitch)) {
                                        for (j = 0; j < sub_rect->h; j++, pixels += pitch)
                                            memset(pixels, 0, sub_rect->w << 2);
                                        SDL_UnlockTexture(is->sub_texture);
                                    }
                                }
                            }
                            frame_queue_next(&is->subpq);
                        } else {
                            break;
                        }
                    }
            }

            frame_queue_next(&is->pictq);
            is->force_refresh = 1;

            if (is->step && !is->paused)
                stream_toggle_pause(is);
        }
display:
        /* display picture */
        if (!display_disable && is->force_refresh && is->show_mode == SHOW_MODE_VIDEO && is->pictq.rindex_shown)
            video_display(is);
    }
    is->force_refresh = 0;
    if (show_status) {
        static int64_t last_time;
        int64_t cur_time;
        int aqsize, vqsize, sqsize;
        double av_diff;

        cur_time = av_gettime_relative();
        if (!last_time || (cur_time - last_time) >= 30000) {
            aqsize = 0;
            vqsize = 0;
            sqsize = 0;
            if (is->audio_st)
                aqsize = is->audioq.size;
            if (is->video_st)
                vqsize = is->videoq.size;
            if (is->subtitle_st)
                sqsize = is->subtitleq.size;
            av_diff = 0;
            if (is->audio_st && is->video_st)
                av_diff = get_clock(&is->audclk) - get_clock(&is->vidclk);
            else if (is->video_st)
                av_diff = get_master_clock(is) - get_clock(&is->vidclk);
            else if (is->audio_st)
                av_diff = get_master_clock(is) - get_clock(&is->audclk);
            av_log(NULL, AV_LOG_INFO,
                   "%7.2f %s:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64"/%"PRId64"   \r",
                   get_master_clock(is),
                   (is->audio_st && is->video_st) ? "A-V" : (is->video_st ? "M-V" : (is->audio_st ? "M-A" : "   ")),
                   av_diff,
                   is->frame_drops_early + is->frame_drops_late,
                   aqsize / 1024,
                   vqsize / 1024,
                   sqsize,
                   is->video_st ? is->viddec.avctx->pts_correction_num_faulty_dts : 0,
                   is->video_st ? is->viddec.avctx->pts_correction_num_faulty_pts : 0);
            fflush(stdout);
            last_time = cur_time;
        }
    }
}

上述就是小編為大家分享的如何進(jìn)行分析FFmpeg ffplay了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享標(biāo)題:如何進(jìn)行分析FFmpegffplay
瀏覽地址:http://chinadenli.net/article0/gpccio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、域名注冊(cè)網(wǎng)站設(shè)計(jì)公司、網(wǎng)站維護(hù)響應(yīng)式網(wǎng)站、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)
亚洲欧美日韩中文字幕二欧美| 国产精品欧美在线观看| 国产精品欧美日韩中文字幕| 日韩女优视频国产一区| 国产又色又粗又黄又爽| 麻豆蜜桃星空传媒在线观看| 91精品视频免费播放| 亚洲欧美日韩在线中文字幕| 日本理论片午夜在线观看| 亚洲欧美一二区日韩高清在线| 国产精品人妻熟女毛片av久| 九九久久精品久久久精品| 东京热男人的天堂社区| 久久精品久久精品中文字幕| 好吊日成人免费视频公开| 国产毛片不卡视频在线| 国内尹人香蕉综合在线| 日本少妇aa特黄大片| 国产精品国产亚洲看不卡| 欧美日韩精品久久亚洲区熟妇人| 日韩精品一区二区三区四区| 在线观看视频成人午夜| 国产一区二区精品高清免费| 色丁香一区二区黑人巨大| 丁香七月啪啪激情综合| 台湾综合熟女一区二区| 国产主播精品福利午夜二区| 日木乱偷人妻中文字幕在线| 国产又猛又黄又粗又爽无遮挡| 亚洲一区二区三区四区| 亚洲第一视频少妇人妻系列| 99精品国产一区二区青青| 日本中文字幕在线精品| 91精品国产综合久久不卡| 99久久精品国产日本| 丰满的人妻一区二区三区| 日本福利写真在线观看| 国产老熟女乱子人伦视频| 国产大屁股喷水在线观看视频| 日本精品啪啪一区二区三区| 激情中文字幕在线观看|