我正在尝试在Popen中使用ffmpeg。我正在尝试的ffmpeg命令在cmd上工作,但在Popen上出现错误。
我使用的是独立的ffmpeg .exe:
ffmpeg -f gdigrab -offset_x 10 -offset_y 20 -show_region 1 -i desktop -video_size 1536x864 -b:v 2M -maxrate 1M -bufsize 1M -tune fastdecode -crf 15 -preset ultrafast -pix_fmt yuv420p -r 25 <path>/video.mov -qp 1 -y -an
这给了我Invalid argument
,但是如果我删除最后一个参数以使输出成为字符串上的最后一件事,我会得到一个不同的错误:
Output file #0 does not contain any stream
我尝试使用-f dshow -i video="UScreenCapture"
而不是gdigrab,但两者最终都给了我相同的错误,无论是否使用参数。
这两个命令在命令行上都有效。
在命令行上,此ffmpeg -list_devices true -f dshow -i dummy
返回以下内容:
[dshow @ 000001b24fa6a300] DirectShow video devices (some may be both video and audio devices)
[dshow @ 000001b24fa6a300] "Integrated Webcam"
[dshow @ 000001b24fa6a300] Alternative name "@device_pnp_\\?\usb#vid_1bcf&pid_2b8a&mi_00#6&2c03619a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 000001b24fa6a300] "UScreenCapture"
[dshow @ 000001b24fa6a300] Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\UScreenCapture"
[dshow @ 000001b24fa6a300] DirectShow audio devices
[dshow @ 000001b24fa6a300] "Microphone (Realtek Audio)"
[dshow @ 000001b24fa6a300] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{35EBFC89-7B09-4557-8032-85AA0B688FE9}"
但是在popen上我不能检查它:
-list_devices true -f dshow -i dummy: Invalid argument
对于代码中的python部分,我使用以下代码:
p = subprocess.Popen([getPathForFile("windows/ffmpeg").replace('\\','/'), " -f gdigrab -offset_x 10 -offset_y 20 -show_region 1 -i desktop -video_size 1536x864 -b:v 2M -maxrate 1M -bufsize 1M -tune fastdecode -crf 15 -preset ultrafast -pix_fmt yuv420p -r 25 -qp 1 -y -an "+ path.replace('\\\\','/').replace('\\','/')+"video.mov"], shell=True)
getPathForFile
是一个返回路径的自定义函数。这是正确的,主要是因为我得到的错误来自ffmpeg,所以...
我使用的是Windows10. FFmpeg 4.0。Python 3.5。
你知道为什么我在Popen上得到这些错误,而不是在命令行上,以及如何修复它们吗?(主要是第二个错误)
发布于 2018-08-21 06:25:35
将每个参数放入其自己的字符串中,并关闭shell。如下所示:
import subprocess
import os
cmd = ["-f", "gdigrab", "-offset_x", "10", "-offset_y", "20",
"-show_region", "1", "-video_size", "1536x864", "-i", "desktop",
"-b:v", "2M", "-maxrate", "1M", "-bufsize", "1M", "-tune", "fastdecode",
"-preset", "ultrafast", "-pix_fmt", "yuv420p",
"-r", "25", "-qp", "1", "-y", "-an",
os.path.join(path, "video.mov")]
p = subprocess.Popen([getPathForFile("windows/ffmpeg")]+cmd)
p.communicate()
https://stackoverflow.com/questions/51938671
复制相似问题