如何使用FFMPEG获取每个场景中间的屏幕截图

时间:2016-01-23 10:40:35

标签: ffmpeg

此代码会截取每个场景的第一帧:

ffmpeg -i video.mp4 -vsync 0 -vf select='gt(scene\,0.4)' -f image2 img-%04d.png

如何获取每个场景中间的屏幕截图?

例如:开始场景 - 1:25;结束场景 - 1:31。如何在1:28上获取屏幕截图?

我试过了:

ffmpeg -i video.mp4 -vsync 0 -vf select='(prev_selected_t*gt(scene\,0.4)+t*gt(scene\,0.4))/2' -f image2 img-%04d.png

这不起作用:(

1 个答案:

答案 0 :(得分:2)

select过滤器在处理每个帧时计算真值或虚假的表达式。你想要帧function init_map() { var urlParams = /\?q=([^,]+),([^,]+)/.exec(window.location.search), var_location; if (urlParams) { var_location = new google.maps.LatLng(parseFloat(urlParams[1]), parseFloat(urlParams[2])); } else { return; } var var_mapoptions = { center: var_location, zoom: 14 }; var var_marker = new google.maps.Marker({ position: var_location, map: var_map, title: "Venice" }); var var_map = new google.maps.Map(document.getElementById("map-container"), var_mapoptions); var_marker.setMap(var_map); } ,两个场景之间的中间帧。当ffmpeg处理帧n时,它不知道场景何时结束。 您编写的过滤器会根据条件选择场景更改帧。

相反,您需要执行一次传递以生成场景更改时间戳列表,然后使用选择过滤器来提取中值帧。

第一部分,来自here

n

然后,

ffprobe -show_frames -of compact=p=0 -f lavfi 
"movie=$F,select=gt(scene\,.4)" | gsed -r 
's/.*pkt_pts_time=([0-9.]{8,})\|.*/\1/' >> scenes-0.4

其中list.txt是

ffmpeg -vsync 0 -f concat -i list.text -vf select=concatdec_select img-%04d.png

其中每个inpoint是场景变化列表中两个数据点之间的中间值,并且outpoint大于每个inpoint,仅在一帧的持续时间之下。这里需要一些试验和错误。