har*_*shi 2 python windows video
我已经从Coursera.org下载了一堆视频,并将它们存储在一个特定的文件夹中。在一个特定的文件夹中有很多单独的视频(Coursera将一个演讲分成多个短视频)。我想拥有一个Python脚本,该脚本可提供特定目录中所有视频的总长度。视频文件为.mp4格式。
首先,使用安装ffprobe
命令(是的一部分ffmpeg
)
sudo apt install ffmpeg
Run Code Online (Sandbox Code Playgroud)
然后调用ffprobe <filename> -print_format json -show_streams -loglevel -quiet
使用subprocess.run()
和解析JSON返回
from pathlib import Path
import subprocess
import json
def video_length_seconds(filename):
result = subprocess.run(['ffprobe', filename, '-print_format', 'json', '-show_streams', '-loglevel', 'quiet'], capture_output=True, text=True)
return float(json.loads(result.stdout)['streams'][0]['duration'])
# all mp4 files in the current directory in seconds
print(sum(video_length_seconds(f) for f in Path('.').glob('*.mp4')))
# all files in the current directory
print(sum(video_length_seconds(f) for f in Path('.').iterdir() if f.is_file()))
Run Code Online (Sandbox Code Playgroud)
此代码需要Python 3.7+,因为那个时候text=
和capture_output=
加入subprocess.run
。如果您的Python版本较旧且无法升级,请查看此答案的编辑历史记录以获取较旧的版本。
此链接显示如何获取视频文件的长度/sf/answers/269112721/
import subprocess
def getLength(filename):
result = subprocess.Popen(["ffprobe", filename],
stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
return [x for x in result.stdout.readlines() if "Duration" in x]
Run Code Online (Sandbox Code Playgroud)
如果您正在使用该函数,则可以用类似的东西将其包装起来
import os
for f in os.listdir('.'):
print "%s: %s" % (f, getLength(f))
Run Code Online (Sandbox Code Playgroud)