此代码会截取每个场景的第一帧:
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
这不起作用:(
答案 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,仅在一帧的持续时间之下。这里需要一些试验和错误。