织梦CMS - 轻松建站从此开始!

罗索

修正ffmpeg.c中加入padding后截图失败的Bug

落鹤生 发布于 2013-09-28 14:29 点击:次 
由于视频本身的格式是YUV,而图片的格式是RGB24,所以dec->pix_fmt和enc->pix_fmt是不一样的。代码段(1)进行crop处理,传递的参数是dec->pix_fmt,所以没有问题。代码段(2)是为pad裁剪出所需要的边框的,它传递的是enc->pix_fmt,这样问题就来了。
TAG:

异常现象:

用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函数中处理的,相关代码如下:
  1.  //(1)进行裁剪 
  2. if (ost->video_crop) { 
  3. if (av_picture_crop((AVPicture *)&picture_crop_temp, 
  4. (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) <0) { 
  5. av_log(NULL, AV_LOG_ERROR, "error cropping picture\n"); 
  6. return
  7. formatted_picture = &picture_crop_temp; 
  8. else { 
  9. formatted_picture = in_picture; 
  10.  
  11. final_picture = formatted_picture; 
  12. padding_src = formatted_picture; 
  13. resampling_dst = &ost->pict_tmp; 
  14. //(2)进行留白处理,则还要把pad所要的边剪掉 
  15. if (ost->video_pad) { 
  16. final_picture = &ost->pict_tmp; 
  17. if (ost->video_resample) { 
  18. if (av_picture_crop((AVPicture *)&picture_pad_temp, 
  19. (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) { 
  20.  
  21. av_log(NULL, AV_LOG_ERROR, "error padding picture\n"); 
  22. return
  23. resampling_dst = &picture_pad_temp; 
  24.  
  25. //(3)如果要重新采样 
  26. if (ost->video_resample) { 
  27. padding_src = NULL; 
  28. final_picture = &ost->pict_tmp; 
  29. sws_scale(ost->img_resample_ctx, formatted_picture->data, 
  30. formatted_picture->linesize, 
  31. 0, ost->resample_height, resampling_dst->data, 
  32. resampling_dst->linesize); 
  33.  
  34. //(4)留白处理 
  35. if (ost->video_pad) { 
  36. av_picture_pad((AVPicture*)final_picture, (AVPicture *) 
  37. padding_src, 
  38. enc->height, enc->width, enc->pix_fmt, 
  39. 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)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201309/16748.html]
本文出处:新浪博客 作者:翱翔高飞IJ
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容