我正在使用以下代码从视频中提取图像。
shell_exec('echo "Y" | ffmpeg -itsoffset -4 -i "'.base_path().'/assets/videos/'.$file_name.'.mp4" -vcodec mjpeg -vframes 1 -an -f rawvideo -s 1170x300 "'.base_path().'/assets/videos/thumbnail/'.$file_name.'.jpg"');
这里我给出了静态高度,因为图像是拉伸所以我不想指定高度,所以有任何方法可以通过保持图像质量自动调整高度。
我也试过以下代码,但没有用
shell_exec('echo "Y" | ffmpeg -itsoffset -4 -i "'.base_path().'/assets/videos/'.$file_name.'.mp4" -vcodec mjpeg -vframes 1 -an -f rawvideo -s 1170x-1 "'.base_path().'/assets/videos/thumbnail/'.$file_name.'.jpg"');
有人可以告诉我解决方案吗?
答案 0 :(得分:1)
首先,如果echo "Y" |
打算在没有提示的情况下覆盖现有的缩略图,-y
会有一个ffmpeg
标记来执行此操作。
现在,假设您希望图片在 维度中不大于 1,170像素,您可以将-s
参数替换为调用scale
视频过滤器和相应的参数。
shell_exec(
'ffmpeg -y -itsoffset -4 -i "'.base_path().'/assets/videos/'.$file_name.'.mp4"'
. ' -vcodec mjpeg -vframes 1 -an -f rawvideo'
. ' -filter:v "scale=iw*min(min(1170/iw\,1170/ih)\,1):ih*min(min(1170/iw\,1170/ih)\,1)"'
. ' "'.base_path().'/assets/videos/thumbnail/'.$file_name.'.jpg"');
这并不能在两个方向上放大小于1,170像素的视频。如果您希望扩展这些缩略图,请将scale=iw*min(min(1170/iw\,1170/ih)\,1):ih*min(min(1170/iw\,1170/ih)\,1)
替换为scale=iw*min(1170/iw\,1170/ih):ih*min(1170/iw\,1170/ih)
。
如果图像始终的宽度为1,170像素,即使它高于1,170像素高,也请使用scale=1170:ih*1170/iw
。
最后,只有宽度增加到1,170像素,scale=min(iw\,1170):min(ih\,ih*1170/iw)