我有以下代碼從視頻中提取幀數:
filename = "test.mp4"
video_path = os.path.join(os.getcwd(), filename)
with open(video_path, "rb") as file:
cmd = f'ffmpeg -i {video_path} -r 10 -q:v 3 -s 1x1 -f image2 -update 1 - >/dev/null'
proc = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)
(stdout, stderr) = proc.communicate()
# i.e: 'frame= 2062 fps=966 q=3.0 Lsize=N/A time=00:10:34.46 bitrate=N/A dup=1049 drop=3563 speed= 297x'
decoded = stderr.decode('utf-8')
frame_count_line = decoded.splitlines()[-2]
m = FRAME_COUNT_REGEX.search(frame_count_line)
if m:
print(int(m.groups()[0]))
但出于安全原因,我想洗掉shell=True引數。不幸的是,之后上面的代碼拋出:
FileNotFoundError: [Errno 2] No such file or directory
請幫忙修復
uj5u.com熱心網友回復:
將您的命令放入串列中,例如
import subprocess
media = 'some media.mp4'
try:
comm = subprocess.Popen(['ffmpeg', '-hide_banner', '-i', media, '-f', 'null', '-'],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
except Exception as e:
print("Error: ", str(e))
try:
with comm.stdout:
for i in iter(comm.stdout.readline, b''):
if i != '':
print(i.strip())
else:
break
except Exception as e:
print("Error: ", str(e))
您也可以使用ffprobe而不是ffmpeg因為ffprobe允許您選擇諸如-count_frames和之類的東西-show_frames。
計數幀只會輸出最終的數字,所以如果你需要顯示發生了什么,你可能會更好-show_frames。例如
ffprobe -show_frames -count_frames -v error -select_streams v:0 -show_entries stream=nb_read_frames -show_entries frame=coded_picture_number -of default=nokey=1:noprint_wrappers=1 -i media
要么
ffprobe -count_frames -v error -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 -i media
要么
ffprobe -show_frames -v error -select_streams v:0 -show_entries frame=coded_picture_number -of default=nokey=1:noprint_wrappers=1 -i media
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/451690.html
下一篇:為什么我的Python代碼ppadb無法連接到Memu?從cmd行可以adb到Memu。Bluestacksadbpython代碼有效,但Memu無效
