Reputation: 121
To get a video's duration and resolution, I've got this function:
def getvideosize(url, verbose=False):
try:
if url.startswith('http:') or url.startswith('https:'):
ffprobe_command = ['ffprobe', '-icy', '0', '-loglevel', 'repeat+warning' if verbose else 'repeat+error', '-print_format', 'json', '-select_streams', 'v', '-show_streams', '-timeout', '60000000', '-user-agent', BILIGRAB_UA, url]
else:
ffprobe_command = ['ffprobe', '-loglevel', 'repeat+warning' if verbose else 'repeat+error', '-print_format', 'json', '-select_streams', 'v', '-show_streams', url]
logcommand(ffprobe_command)
ffprobe_process = subprocess.Popen(ffprobe_command, stdout=subprocess.PIPE)
try:
ffprobe_output = json.loads(ffprobe_process.communicate()[0].decode('utf-8', 'replace'))
except KeyboardInterrupt:
logging.warning('Cancelling getting video size, press Ctrl-C again to terminate.')
ffprobe_process.terminate()
return 0, 0
width, height, widthxheight, duration = 0, 0, 0, 0
for stream in dict.get(ffprobe_output, 'streams') or []:
if dict.get(stream, 'duration') > duration:
duration = dict.get(stream, 'duration')
if dict.get(stream, 'width')*dict.get(stream, 'height') > widthxheight:
width, height = dict.get(stream, 'width'), dict.get(stream, 'height')
if duration == 0:
duration = 1800
return [[int(width), int(height)], int(float(duration))+1]
except Exception as e:
logorraise(e)
return [[0, 0], 0]
But some online videos comes without duration
tag. Can we do something to get its duration?
Upvotes: 6
Views: 4053
Reputation: 1918
I know this question is old, but there's a better way to do this.
By combining einverne's answer with some actual Python (Python 3.5 in this case) we can create a short function that returns the number of seconds (duration) in a video.
import subprocess
def get_duration(file):
"""Get the duration of a video using ffprobe."""
cmd = ['ffprobe', '-i', file, '-show_entries', 'format=duration',
'-v', 'quiet', '-of', 'csv="p=0"']
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
output = float(output)
return round(output)
And to call this function:
video_length_in_seconds = get_duration('/path/to/your/file') # mp4, avi, etc
This will give you the total seconds, rounded to the closest full second. So if your video is 30.6 seconds, this will return 31
.
The FFMpeg command ffprobe -i video_file_here -show_entries format=duration -v quiet -of csv="p=0"
will get your video duration for you and shouldn't download the entire video.
Upvotes: 2
Reputation: 584
import cv2
data = cv2.VideoCapture('https://v.buddyku.id/ugc/m3YXvl-61837b3d8a0706e1ee0ab139.mp4')
frames = data.get(cv2.CAP_PROP_FRAME_COUNT)
fps = int(data.get(cv2.CAP_PROP_FPS))
seconds = int(frames / fps)
print("duration in seconds:", seconds)
Upvotes: 3
Reputation: 6682
If you have direct link to the video itself, like http://www.dl.com/xxx.mp4, you can direct use ffprobe
to get the duration of this video by using:
ffprobe -i some_video_direct_link -show_entries format=duration -v quiet -of csv="p=0"
Upvotes: 11