Skip to content

Instantly share code, notes, and snippets.

@lpmi-13
Forked from hiwonjoon/python-ffmpeg.py
Created December 16, 2017 10:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lpmi-13/a8accda060fb8f66c443e113a36ee20c to your computer and use it in GitHub Desktop.
Save lpmi-13/a8accda060fb8f66c443e113a36ee20c to your computer and use it in GitHub Desktop.
ffmpeg and ffprobe subprocess call in python; extract specific frame at some timepoint, extract duration of a video
import subprocess
import datetime
import numpy as np
THREAD_NUM=4
def get_video_info(fileloc) :
command = ['ffprobe',
'-v', 'fatal',
'-show_entries', 'stream=width,height,r_frame_rate,duration',
'-of', 'default=noprint_wrappers=1:nokey=1',
fileloc, '-sexagesimal']
ffmpeg = subprocess.Popen(command, stderr=subprocess.PIPE ,stdout = subprocess.PIPE )
out, err = ffmpeg.communicate()
if(err) : print(err)
out = out.split('\n')
return {'file' : fileloc,
'width': int(out[0]),
'height' : int(out[1]),
'fps': float(out[2].split('/')[0])/float(out[2].split('/')[1]),
'duration' : out[3] }
def get_video_frame_count(fileloc) : # This function is spearated since it is slow.
command = ['ffprobe',
'-v', 'fatal',
'-count_frames',
'-show_entries', 'stream=nb_read_frames',
'-of', 'default=noprint_wrappers=1:nokey=1',
fileloc, '-sexagesimal']
ffmpeg = subprocess.Popen(command, stderr=subprocess.PIPE ,stdout = subprocess.PIPE )
out, err = ffmpeg.communicate()
if(err) : print(err)
out = out.split('\n')
return {'file' : fileloc,
'frames' : out[0]}
def read_frame(fileloc,frame,fps,num_frame,t_w,t_h) :
command = ['ffmpeg',
'-loglevel', 'fatal',
'-ss', str(datetime.timedelta(seconds=frame/fps)),
'-i', fileloc,
#'-vf', '"select=gte(n,%d)"'%(frame),
'-threads', str(THREAD_NUM),
'-vf', 'scale=%d:%d'%(t_w,t_h),
'-vframes', str(num_frame),
'-f', 'image2pipe',
'-pix_fmt', 'rgb24',
'-vcodec', 'rawvideo', '-']
#print(command)
ffmpeg = subprocess.Popen(command, stderr=subprocess.PIPE ,stdout = subprocess.PIPE )
out, err = ffmpeg.communicate()
if(err) : print('error',err); return None;
video = np.fromstring(out, dtype='uint8').reshape((num_frame,t_h,t_w,3)) #NHWC
return video
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment