1

ffmpeg ライブラリを調べてセットアップするのにしばらく時間を費やしました。.flv ファイルを開いています。フレームの読み取りとデコード、およびフレームを MP4 にエンコードしようとしていますが、パケットが空になります。

次のように私のコード

int main (){

    avformat_open_input(&pFC, "c://wav//test2.flv", NULL, NULL);

    po = av_find_stream_info(pFC);

    //ADD LOGIC TO FIND VIDEO STREAM
    pCodecC = pFC->streams[0]->codec;

    decoder = avcodec_find_decoder(pCodecC->codec_id);
    encoder = avcodec_find_encoder(pCodecC->codec_id);
    po = avcodec_open(pCodecC, decoder);

    pCodecE =  avcodec_alloc_context3(encoder);
    /* put sample parameters */
    pCodecE->bit_rate = 400000;
    /* resolution must be a multiple of two */
    pCodecE->width = 352;
    pCodecE->height = 288;
    /* frames per second */
    pCodecE->time_base.den = 25;
    pCodecE->time_base.num = 1;
    pCodecE->gop_size = 10; /* emit one intra frame every ten frames */
    pCodecE->max_b_frames=1;
    pCodecE->pix_fmt = PIX_FMT_YUV420P;

    if(pCodecC->codec_id == CODEC_ID_H264)
        av_opt_set(pCodecE->priv_data, "preset", "slow", 0);

    po =  avcodec_open2(pCodecE, encoder, NULL);

    AVFrame *pFrame;
    // Allocate an AVFrame structure



    // Allocate video frame
    pFrame=avcodec_alloc_frame();
    int frameFinished = 0;
    int frame = 0;
    int gotpacket = 0;

    while(av_read_frame(pFC, &packet) >= 0)
    {
        if(packet.stream_index==0) //the video stream is 0
        {
            int len = avcodec_decode_video2(pCodecC, pFrame, &frameFinished, &packet);
            if(frameFinished)
            {
                printf("frame # %i", frame);

                po =avcodec_encode_video2(pCodecE, &spacket, pFrame, &gotpacket);
                if(gotpacket)
                {
                    printf("packet recieved");
                }
                frame++;
            }
        }
        av_free_packet(&packet);
    }


    printf("encoding done");

    return 0;
}

基本的にすべてが機能します

 po =avcodec_encode_video2(pCodecE, &spacket, pFrame, &gotpacket);

&gotpacketのフレームのように 0 を返します。

私が間違っているのかわかりません。

4

2 に答える 2

0

pFrame のポイントをインクリメントすると (各エンコード後に)、この問題が解決することがわかりました。

pFrame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base);

video_st は出力ストリームです。

于 2013-02-11T22:16:52.707 に答える
0

ドキュメントが言うように。フレームは内部的にバッファリングされる場合があります。この場合、gotpacket == 0. 画像を書き続けると、ある時点でgotpacket != 0

フレームに NULL を渡してエンコーダーをフラッシュすることもできると思います。私はこの考えを試していません。

幸運を。

于 2012-09-28T22:21:55.020 に答える