2

PIX_FMT_ARGB形式の画像をmp4ビデオに多重化しています。

送信画像の最後のピクセル行がめちゃくちゃになっていることを除いて、すべてうまく機能します。ほとんどの場合、最後の行は完全に黒で、他の色がある場合もありますが、それが実行されているマシンに何らかの形で依存しているようです。

スケーリングの前後に画像を保存しているので、エラーはsws_scaleにあるはずです。入力画像にエラーはありませんが、sws_scale()の後で、yuv画像を保存すると、エラーが明らかになります。

次に例を示します。

オリジナル

ここに画像の説明を入力してください

Yuvfile(sws_scaleの後)

ここに画像の説明を入力してください

Yuvfileの下部に、黒い行が表示されます。

これは私がスケーリングを行う方法です(それは公式のffmpegの例の後です、多かれ少なかれ):

static int sws_flags = SWS_FAST_BILINEAR | SWS_ACCURATE_RND;

if (img_convert_ctx == NULL)
{
   img_convert_ctx = sws_getContext( srcWidth, srcHeight,
           PIX_FMT_ARGB,
           codecContext->width, codecContext->height,
           codecContext->pix_fmt,
           sws_flags, NULL, NULL, NULL );
   if (img_convert_ctx == NULL)
   {
      av_log(c, AV_LOG_ERROR, "%s","Cannot initialize the conversion context\n");
      exit(1);
   }
}
fill_image(tmp_picture, pic, pic_size, frame_count, ptr->srcWidth, ptr->srcHeight );

sws_scale(img_convert_ctx, tmp_picture->data, tmp_picture->linesize,
        0, srcHeight, picture->data, picture->linesize);

また、いくつかの異なるSWS_フラグを試しましたが、すべて同じ結果になります。

これはsws_scaleのバグでしょうか、それとも何か間違ったことをしていますか?ffmpegライブラリの最新バージョンを使用しています。

4

2 に答える 2

2

問題はこの関数でした:

fill_image(tmp_picture, pic, pic_size, frame_count, ptr->srcWidth, ptr->srcHeight );

入力画像をtmp_pictureに正しくコピーしませんでした。確かに最後の行をスキップしました。

士気:何年も前の機能を信用しないでください:D

于 2012-07-23T12:02:05.270 に答える
1

180は8の倍数ではありません。これが、黒い行の理由である可能性があります。8の最も近い倍数、たとえば184または192(16の倍数)にスケーリングしてみてください。h264以外のコーデックでは、高さとして8の倍数が必要です。

于 2012-07-22T05:13:36.023 に答える