簡體   English   中英

(C) avcodec_receive_frame (ffmpeg) function 總是返回 AVERROR(EAGAIN)

[英](C) avcodec_receive_frame (ffmpeg) function always returns AVERROR(EAGAIN)

我正在關注本教程: http://dranger.com/ffmpeg/tutorial01.html並試圖更改一些不推薦使用的函數,因此我不得不嘗試使用avcodec_send_packetavcodec_receive_frame函數。

我遇到的問題是avcodec_receive_frame總是返回AVERROR(EAGAIN)

我的解碼function如下:

static int decode(AVCodecContext *pCodecCtx, AVFrame *pFrame, AVPacket *packet) {
    
    int ret = avcodec_send_packet(pCodecCtx, packet);
    if (ret<0) {
        fprintf(stderr, "error sending packet for decoding\n");
        exit(1);
    }

    while (ret>=0) {        
        // avcodec_receive_packet(pCodecCtx, NULL);
        ret = avcodec_receive_frame(pCodecCtx, pFrame);
        if (ret == AVERROR(EAGAIN)) {
            fprintf(stderr, "\naverror(eagain) ret = %d\n", ret);
            return -1;
        }
        else if (ret == AVERROR_EOF) {
            fprintf(stderr, "eof\n");
            return -100;
        }
        else if (ret <0) {
            fprintf(stderr, "error during decoding\n");
            exit(1);
        }
    }
    return 0;
}

我讀到的所有地方都說這可以通過在下一幀調用avcodec_send_packet來解決,但這對我來說並沒有解決問題,因為這個 function 是在循環中調用的:


    while (av_read_frame(pFormatCtx, &packet)>=0) {
        // is this a packet from the video stream?
        if (packet.stream_index==videoStream) {

           frameNotFinished = decode(pCodecCtx, pFrame, &packet);

            // did we get a video frame?
            if (!frameNotFinished) fprintf(stderr, "it worked!");
        }
        av_packet_unref(&packet);   
    }

我可能還應該補充一點, avcodec_send_packet總是返回 0(成功)。

任何幫助將非常感激。

當你真正得到一個框架時你永遠不會回來(ret == 0)

另一方面,如果您返回,您實際上不會“解碼”所有幀,直到您獲得 AVERROR(EAGAIN) 這意味着您可能會丟失一些幀。 所以,我想你首先必須決定你到底想做什么。

(我想你只需要在while(ret> = 0)內有你的“過程” function 如果你有 ret == 0 你做任何你做的事)

過程如下......

  1. 你解復用一個數據包 [av_read_frame]
  2. 如果是 X 視頻 stream 數據包,則將其發送到解碼器 [avcodec_send_packet]
  3. 您嘗試解碼並接收所有可用的 AVFrame(如果有)[avcodec_receive_frame]

3.1)如果沒有可用的幀,您會收到 AVERROR(EAGAIN) 並且您必須向解碼器發送更多數據包(返回步驟 1)

3.2)如果幀可用,你 avcodec_receive_frame 直到你得到 AVERROR(EAGAIN)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM