user42
user42

Reputation: 959

How to efficiently extract specific sections of a video (Python/FFmpeg)?

I have a bunch of videos for which I want to extract specific sections (either as videos or as frames). I get the specific sections from a .json file where the start and end frames are stored according to labels, like 'cat in video', 'dog in video'. I have an existing method in Python using opencv using the method mentioned here but I found a one-liner using ffmpeg which is a lot more faster and efficient than my Python script, except that I have to manually fill in the start and end frames in this command.

ffmpeg -i in.mp4 -vf select='between(n\,x\,y)' -vsync 0 frames%d.png

I read a few questions about working with .json files in a shell script or passing arguments to a batch script which looks quite complicated and might spoil my system. Since I'm not familar working with .json files in a shell/batch script, I'm not sure how to start. Can anyone point me in the right direction on how to make a batch script that can read variables from a .json file and input it into my ffmpeg command?

Upvotes: 2

Views: 1437

Answers (2)

kesh
kesh

Reputation: 5463

Python natively supports JSON with its builtin json package

As for doing this in python, here is an alternative approach that you can try my ffmpegio-core package:

import ffmpegio

ffmpegio.transcode('in.mp4','frames%d.png',vf=f"select='between(n\,{x}\,{y})'",vsync=0)

If the videos are constant frame rate, it could be faster to specify the start and end timestamps as input options:

fs = ffmpegio.probe.video_streams_basic('in.mp4')[0]['frame_rate']
ffmpegio.transcode('in.mp4', 'frames%d.png', ss_in=x/fs, to_in=y/fs, vsync=0)

If you don't know the frame rate, you are calling ffprobe and ffmpeg for each file, so there is a tradeoff. But if your input video is long, it could be worthwhile.

But if speed is your primary goal, calling FFmpeg directly always is the fastest.

ffmpegio GitHub repo

Upvotes: 0

AndrejH
AndrejH

Reputation: 2109

Since you're already familiar with Python, I suggest you to use it to parse JSON files, then you can use ffmpeg-python library, which is a ffmpeg binding for Python. It also has a crop function, which I assume is what you need.

An alternative would be to use the os.system('ffmpeg <arguments>') calls from a Python script, which allows you to run external tools from the script.

Upvotes: 1

Related Questions