您的位置:首页 > 其它

关于视频画面裁切功能

2017-05-09 11:48 120 查看
想要将大的h264画面裁切为里面小的某一部分当做新的视频,大部分人的想法是先将h264解码,然后yuv拷贝为小画面,然后再重新编码。

然后解码和编码都非常耗资源,即便是可以使用GPU硬件加速,但有时候项目使用的是vm虚拟机,这时候硬件加速也用不上了。那怎么办呢?

这里有个好的办法。首先h264里面sps有以下变量

 bool frame_cropping_flag;

          int frame_crop_left_offset;

          int frame_crop_right_offset;

          int frame_crop_top_offset;

          int frame_crop_bottom_offset;

那么修改这些变量是否有效呢?

通过代码先解析原视频h264sps各个变量,然后重新生成新的sps

这里要注意的是sps的分辨率计算
width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_left_offset*2 - frame_crop_right_offset*2;
height= ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - \
(frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2);
第二注意的是解析和编码sps时的指数哥伦布编码

修改后结果是window media player 和vlc,QQ播放器,potplayer都是正常播放的,但是浏览器(chrome)等等播放的画面是原图像左上角的,也就是

frame_crop_left_offset无效,可以看看附件的dd.mp4,浏览器播放明显不正常,这应该是chrome没处理好crop信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  h264