1

ここでは FFmpeg ビデオ エンコンディングの例に従っていますが、ダミーの YUV420P フレームがいくつか作成され、カメラから BGR 画像が既にキャプチャされています。

代わりに BGR 画像を使用する方法frame->data[]とそれらを埋める方法がわからないので、H264 ビデオをエンコードできます。frame->linesize[]


編集:

ロナルドの答えの後に、次のコードがあります(カメラが送信する新しい写真ごとに呼び出されます):

    .............
    AVFrame *bgrFrame = av_frame_alloc();

    bgrFrame->width = originalBGRImage.cols;
    bgrFrame->height = originalBGRImage.rows;

    ret = av_image_alloc(bgrFrame->data, bgrFrame->linesize, bgrFrame->width, bgrFrame->height, AV_PIX_FMT_BGR24, 32);

    /////////////////////////////////////
    // This works and prevents memory leak....if I remove it, it consumes all the RAM....but I can't free this memory here, since I will use it later...
    av_freep(&bgrFrame->data[0]);
    av_frame_free(&bgrFrame);
    return;
    /////////////////////////////////////

    ret = av_image_fill_pointers(bgrFrame->data, AV_PIX_FMT_BGR24, bgrFrame->height, originalBGRImage.data, bgrFrame->linesize);

    /////////////////////////////////////
    // Here is where I am done using the memory so I will want to free it...but this same code crashes the program.
    av_freep(&bgrFrame->data[0]);
    av_frame_free(&bgrFrame);
    return;
    /////////////////////////////////////

したがってav_freep(&bgrFrame->data[0]);、コードの最後にある を削除すると、メモリリークが発生します...しかし、そのままにしておくとクラッシュします....では、使用済みメモリを解放する正しい方法は何ですか?

4

1 に答える 1

1

av_image_fill_linesizes()を使用してラインサイズを塗りつぶし (パディングされていない場合、手動で指定する必要があります)、その後av_image_fill_pointers()を使用してデータ ポインターを塗りつぶします。pix_fmt として、 AV_PIX_FMT_BGR24を使用します。

これで、BGR24 の画像が得られます。libx264rgbエンコーダーを使用して、RGB H264 画像としてエンコードできます。YUV H264 をエンコードする場合は、まず RGB イメージを YUV に変換する必要があります。これは、libswscale を使用して実行できます。Google の「libswscale の例」で、その方法に関するサンプル コードを見つけてください。

于 2016-02-02T12:30:28.613 に答える