我正在构建一个在线视频编辑器。我需要允许用户模糊电影的一个区域。这必须以图形方式完成,我的意思是用户应该能够使用屏幕截图选择视频的一个区域,然后必须对所选区域进行模糊处理。像这样的东西
有没有办法将这个选定的区域尺寸及其与边界的距离映射到必须应用于视频的实际值?
我的意思是四个数字,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
的视频也没有变得模糊。
最佳答案
运行
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
滤镜将所有变形视频缩放为方形像素,并且 800 像素的屏幕截图也未失真。如果您使用 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"
我对影片进行了缩放,以确保我们处理的始终是方形像素视频。
关于javascript - FFMPEG,使用图像选择区域插件模糊视频区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38289270/