要获得视频的持续时间和分辨率,我已经拥有此功能:
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]
但有些在线视频没有duration
标记。我们能做些什么来获得它的持续时间吗?
答案 0 :(得分:5)
如果您有直接链接到视频本身,例如http://www.dl.com/xxx.mp4,则可以使用ffprobe
直接使用ffprobe -i some_video_direct_link -show_entries format=duration -v quiet -of csv="p=0"
来获取此视频的持续时间:
"CRAM-MD5"
答案 1 :(得分:0)
我知道这个问题已经过时了,但是有更好的方法可以做到这一点。
通过将einverne的答案与一些实际的Python(在本例中为Python 3.5)相结合,我们可以创建一个返回视频中秒数(持续时间)的短函数。
import subprocess
def get_duration(file):
"""Get the duration of a video using ffprobe."""
cmd = 'ffprobe -i {} -show_entries format=duration -v quiet -of csv="p=0"'.format(file)
output = subprocess.check_output(
cmd,
shell=True,
stderr=subprocess.STDOUT
)
output = float(output)
return round(output)
并调用此函数:
video_length_in_seconds = get_duration('/path/to/your/file') # mp4, avi, etc
这将为您提供总秒数,四舍五入到最接近的完整秒数。因此,如果您的视频为30.6秒,则会返回31
。
FFMpeg命令ffprobe -i video_file_here -show_entries format=duration -v quiet -of csv="p=0"
将为您提供视频时长,不应下载整个视频。