异常现象:
用ffmpeg来截一张图片,执行下面命令
ffmpeg -i lehehai.asf -vframes 1 -ss 50 -f image2 toimage.bmp
能正确执行。增加crop后也可以运行成功
ffmpeg -i lehehai.asf -vframes 1 -ss 50 -croptop 50 -cropbottom 50 -f image2 toimage.bmp
但加入padding后就运行失败了
ffmpeg -i lehehai.asf -vframes 1 -ss 50 -croptop 50 -cropbottom 50 -padleft 10 -padright 20 -f image2 toimage.bmp
原因分析:
跟踪代码,crop和padding是在do_video_out函数中处理的,相关代码如下:
-
- if (ost->video_crop) {
- if (av_picture_crop((AVPicture *)&picture_crop_temp,
- (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) <0) {
- av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
- return;
- }
- formatted_picture = &picture_crop_temp;
- } else {
- formatted_picture = in_picture;
- }
-
- final_picture = formatted_picture;
- padding_src = formatted_picture;
- resampling_dst = &ost->pict_tmp;
-
- if (ost->video_pad) {
- final_picture = &ost->pict_tmp;
- if (ost->video_resample) {
- if (av_picture_crop((AVPicture *)&picture_pad_temp,
- (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
-
- av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
- return;
- }
- resampling_dst = &picture_pad_temp;
- }
- }
-
-
- if (ost->video_resample) {
- padding_src = NULL;
- final_picture = &ost->pict_tmp;
- sws_scale(ost->img_resample_ctx, formatted_picture->data,
- formatted_picture->linesize,
- 0, ost->resample_height, resampling_dst->data,
- resampling_dst->linesize);
- }
-
-
- if (ost->video_pad) {
- av_picture_pad((AVPicture*)final_picture, (AVPicture *)
- padding_src,
- enc->height, enc->width, enc->pix_fmt,
- ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
- }
由于视频本身的格式是YUV,而图片的格式是RGB24,所以dec->pix_fmt和enc->pix_fmt是不一样的。
代码段(1)进行crop处理,传递的参数是dec->pix_fmt,所以没有问题。
代码段(2)是为pad裁剪出所需要的边框的,它传递的是enc->pix_fmt,这样问题就来了。因为picture_pad_temp中的是
YUV格式的图片来的,现在直接以RGB24来进行处理,所以会出错。由于之前都是转换视频,所以dec->pix_fmt和enc->pix_fmt
是一样的,不会出错。
代码(3)进行了重新采样。
代码(4)可以传递enc->pix_fmt进行pad处理,这是因为经过代码(3)处理后的final_picture就是RGB24格式的了。
解决方案:
将代码段(2)中的enc->pix_fmt改为dec->pix_fmt就可以了。改完后同时测试了一下视频转换,也能正确运行。
注:感谢“jaron”的分析与解决。
(翱翔高飞IJ) |