问题
I am new to the forum so I hope I've formulated this question correctly.
I have downloaded newest version of FFMPEG and I would like to use it to modify existing video by inserting time gaps in it.
Here is what I mean by time gap. If I have input video that lasts 2 seconds and was recorded at FPS=10, timestamps of its frames would be as follows:
0.1s, 0.2s,0.3s,0.4s, .. 1.7s, 1.8s, 1.9.s, 2s
If I would to introduce time gaps, input videos frame would be something like this:
0.1s, 0.2s, 0.9s, 1s, 1.1s, 1.7s, 1.8s, 1.9s, 2s
Is something like this possible to achieve?
!!!EDIT!!!
I would like to post here results of the commands Gyan was kind enough to comment.
For command:
ffmpeg -i input.mp4 -vf "setpts='PTS+gte(t,0.3)*(0.6/TB)+gte(t,1.5)*(1.1/TB)',showinfo" -vsync vfr out.mp4
I am getting:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:09.30, start: 0.000000, bitrate: 1185 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 960x540, 1184 kb/s, 10 fps, 10 tbr, 10240 tbn, 20480 tbc (default)
Metadata:
handler_name : VideoHandler
File 'out.mp4' already exists. Overwrite ? [y/N] y
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[Parsed_setpts_0 @ 0x55e4f4f85400] [Eval @ 0x7fffadb2ac80] Unknown function in 't,0.3)*(0.6/TB)+gte(t,1.5)*(1.1/TB)'
[Parsed_setpts_0 @ 0x55e4f4f85400] Error while parsing expression 'PTS+gte(t,0.3)*(0.6/TB)+gte(t,1.5)*(1.1/TB)'
[AVFilterGraph @ 0x55e4f4eff400] Error initializing filter 'setpts' with args 'PTS+gte(t,0.3)*(0.6/TB)+gte(t,1.5)*(1.1/TB)'
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0
Conversion failed!
And for command:
ffmpeg -i input.mp4 -vf select='not(between(t,0.3,0.7)+between(t,1.5.1.8))' -vsync vfr out.mp4
I am getting:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:09.30, start: 0.000000, bitrate: 1185 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 960x540, 1184 kb/s, 10 fps, 10 tbr, 10240 tbn, 20480 tbc (default)
Metadata:
handler_name : VideoHandler
File 'out.mp4' already exists. Overwrite ? [y/N] y
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[Parsed_select_0 @ 0x55ce2c4f9d00] [Eval @ 0x7ffc980730c0] Missing ')' or too many args in 'between(t'
[Parsed_select_0 @ 0x55ce2c4f9d00] Error while parsing expression 'not(between(t'
[AVFilterGraph @ 0x55ce2c491a00] Error initializing filter 'select' with args 'not(between(t'
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0
Conversion failed!
回答1:
Shifting timestamps
This is possible using the setpts filter.
Assuming no audio, command would look like this
ffmpeg -i in -vf setpts='PTS+gte(T\,0.3)*(0.6/TB)+gte(T\,1.5)*(1.1/TB)' -vsync vfr out
This will offset all frames with timestamps 0.3s or greater forward by 0.6s. It will also offset all frames with timestamps 1.5s or greater forward by 1.1s. These latter set of frames will have both offsets applied to them, so net offset is 0.6 + 1.1 = 1.7s. Each offset group is composed of two parts: (qualification)*(offset)
. All offset groups are added together with the original timestamp (PTS
).
Removing frames
Assuming no audio, basic form is
ffmpeg -i in -vf select='not(between(t\,0.3\,0.7)+between(t\,1.5\,1.8))' -vsync vfr out
This will remove frames having timestamps between 0.3 and 0.7s and between 1.5s and 1.8s.
来源:https://stackoverflow.com/questions/56524334/how-can-i-create-time-gaps-in-video-recordings-using-newest-version-of-ffmpeg