所以,我试图通过这里讨论的方法找到视频文件的长度:How to get the duration of a video in Python?,Using ffmpeg to obtain video durations in python。但是这样做我遇到了一个我无法解决的问题:我得到了
FileNotFoundError:[WinError 2] The system cannot find the file specified
在尝试了一系列故障排除步骤后,我开始在IPython和cmd中单独运行以查看事情可能会发生的故障。在IPython中使用这个代码的精简版本给了我
In [11]: subprocess.Popen([ffmpeg_path+'ffprobe'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Out[11]: <subprocess.Popen at (...)>
这似乎很好,就像此时的CMD一样。所以增加一点复杂性:
In [17]: subprocess.Popen([ffmpeg_path+'ffprobe -i "F:/tst.mp4"'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-17-4e8b2cad7702> in <module>()
----> 1 subprocess.Popen([ffmpeg_path+'ffprobe -i "F:/tst.mp4"'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
C:\Python\Anaconda3\lib\subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors)
705 c2pread, c2pwrite,
706 errread, errwrite,
--> 707 restore_signals, start_new_session)
708 except:
709 # Cleanup if the child failed starting.
C:\Python\Anaconda3\lib\subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_start_new_session)
988 env,
989 cwd,
--> 990 startupinfo)
991 finally:
992 # Child is launched. Close the parent's copy of those pipe
FileNotFoundError: [WinError 2] The system cannot find the file specified
这会让IPython崩溃。在CMD中运行相同的命令ffprobe -i "F:/tst.mp4"
就像一个魅力。
这是我尝试过的:更改/到\和\,在文件路径周围添加和删除引号,将路径更改为C:\ tst.mp4。
运行命令os.system(ffmpeg_path+'ffprobe -i "F:/tst.mp4")
确实有效。
这里可能出现什么问题?
答案 0 :(得分:1)
使用列表作为subprocess.Popen
的第一个参数,因为该列表作为执行程序的参数传递:
subprocess.Popen([ffmpeg_path + 'ffprobe', '-i', 'F:\\tst.mp4'], ...)
例如,Popen(['foo bar'])
与运行名为foo bar.exe
的可执行文件相同,但Popen(['foo', 'bar'])
将使用参数foo.exe
执行bar
。
如果您感兴趣的是该命令的输出,则可能需要使用subprocess.check_output
:
output = subprocess.check_output([ffmpeg_path + 'ffprobe', '-i', 'F:\\tst.mp4'])