我正在建立一个在线视频编辑器。我需要允许用户模糊电影区域。这必须以图形方式完成,我的意思是用户应该能够使用屏幕截图选择视频区域,然后必须模糊所选区域。像这样的事情
是否有将此选定区域尺寸及其与边框的距离映射到必须应用于视频的实际值?
我的意思是使用此插件提供四个数字width, length, top, left
,我需要使用这些数字来模糊视频区域。
我拍了一段视频截图。为了保持纵横比,我将宽度固定为800px
并让高度按比例放大/缩小。很明显,屏幕截图所选区域的width, length, top, left
是视频中必须模糊的区域width, length, top, left
的因子。但我不知道如何得到这个因素。除此之外,我不知道如何获得视频分辨率。
提前致谢。
这是我的PHP代码,它可以获取所选的区域尺寸和偏移量
$iLeft = $_POST['left'];
$iTop = $_POST['top'];
$iWidth = $_POST['width'];
$iHeight = $_POST['height'];
exec('ffmpeg -i '.$url.' -filter_complex "[0:v]scale=iw*sar:ih,setsar=1,split[bg][bb];[bb]crop='.$iWidth.'*iw/800:iw*'.$iHeight.'/800:'.$iWidth.'*iw/800:'.$iHeight.'*iw/800,boxblur=10[b0];[bg][b0]overlay='.$iLeft.'*W/800:'.$iTop.'*W/800"" '.$name.' > block.txt 2>&1');
$iLeft, $iTop, $iWidth, $iHeight
是通过图片插件选定区域的左侧,顶部,宽度和高度。
它很好地模糊了许多选定的区域,但是像这样的区域
图片Left, Top, Width, Height
为257, 39.26666259765625, 10, 391
207x207
的视频也不会模糊。
答案 0 :(得分:1)
运行
ffprobe in.mp4 -loglevel quiet -select_streams v -show_entries stream=width,height,sample_aspect_ratio -of compact=p=0:nk=1
将生成如下所示的输出:
1280|720|1:1
第一个条目是视频宽度,然后是高度,最后是像素或样本宽高比,显示为num:den,因此它是num / den。这是您的视频分辨率。
使用该信息,因子为video-width*sar/800
。这假设您使用scale
和setsar
过滤器将所有变形视频缩放为方形像素,并且800px屏幕截图也不会失真。如果您正在使用FFmpeg缩放屏幕截图,那么scale=800:ih*800/iw/sar
因此区域宽度的FFmpeg值为screenshot area width * video-width*sar/800
。
和FFmpeg Y坐标是screenshot top * video-width*sar/800
,依此类推。
假设评论中的代码用于截图,对于全尺寸电影,它将是
"[0:v]scale=iw*sar:ih,setsar=1,split[bg][bb];[bb]crop=50*iw/800:50*iw/800:20*iw/800:10*iw/800,boxblur='min(min(cw/2\,ch/2)\,10)'[b0];
[bg][b0]overlay=20*W/800:10*W/800"
我已经缩放了电影,以确保我们始终处理方像素视频。