想要将大的h264画面裁切为里面小的某一部分当做新的视频,大部分人的想法是先将h264解码,然后yuv拷贝为小画面,然后再重新编码。
然后解码和编码都非常耗资源,即便是可以使用GPU硬件加速,但有时候项目使用的是vm虚拟机,这时候硬件加速也用不上了。那怎么办呢?
这里有个好的办法。首先h264里面sps有以下变量
那么修改这些变量是否有效呢?
通过代码先解析原视频h264sps各个变量,然后重新生成新的sps
这里要注意的是sps的分辨率计算
然后解码和编码都非常耗资源,即便是可以使用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信息