How can I create time gaps in video recordings using newest version of FFMPEG?

ε祈祈猫儿з 提交于 2019-12-11 06:14:18

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!