0

CAIRO_FORMAT_ARGB32 から AV_PIX_FMT_YUV420P までの一連のフレームを sws_scale でエンコードする必要があります。ffmpeg docs から、ソース形式に相当する AV が AV_PIX_FMT_ARGB であることを知ったので、ここに私のコードを示します。

 // Set up conversion context
    img->sws_ctx = sws_getCachedContext(
        img->sws_ctx,
        img->video_size[0],
        img->video_size[1],
        AV_PIX_FMT_ARGB,
        img->video_size[0],
        img->video_size[1],
        AV_PIX_FMT_YUV420P,
        SWS_BILINEAR,
        NULL,
        NULL,
        NULL);

    width  = cairo_image_surface_get_width( surface );
    height = cairo_image_surface_get_height( surface );
    stride = cairo_image_surface_get_stride( surface );
    pix    = cairo_image_surface_get_data( surface );
    const int in_linesize[1] = { stride };
    
    sws_scale(  img->sws_ctx, (const uint8_t * const *) &pix, in_linesize, 0,
                img->video_size[1], img->video_frame->data, img->video_frame->linesize);
    img->video_frame->pts++;

悲しいことに、ビデオは再生されず、VLC はこれらの役に立たないメッセージをたくさん表示します。

[h264 @ 0x7f6ce0cbc1c0] mmco: unref short failure
[h264 @ 0x7f6ce0c39a80] co located POCs unavailable
[h264 @ 0x7f6ce0c82800] co located POCs unavailable
[h264 @ 0x7f6ce0c9f400] mmco: unref short failure

エンコードプロセスは問題なく実行されます。const int in_linesize[1] = { 3 * width }; も試しました。どこが間違っていますか?

4

1 に答える 1