Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Windows上带有Popen(python)的ffmpeg_Python 3.x_Ffmpeg - Fatal编程技术网

Python 3.x Windows上带有Popen(python)的ffmpeg

Python 3.x Windows上带有Popen(python)的ffmpeg,python-3.x,ffmpeg,Python 3.x,Ffmpeg,我正在尝试将ffmpeg与Popen一起使用。我正在尝试的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_f

我正在尝试将ffmpeg与Popen一起使用。我正在尝试的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
但在popen上我无法检查:

-list\u devices true-f dshow-i dummy:无效参数

对于代码的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上而不是在命令行上遇到这些错误吗?以及如何修复它们?(主要是第二个错误)

将每个参数放在自己的字符串中并关闭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()

将每个参数放在它自己的字符串中,然后旋转shell。类似于p=subprocess.Popen([“ffmpeg.exe”、“-arg1”、“blahblah”、“-arg2”、“blahblah2”);p、 通信()。哦,是的,你不必把反斜杠变成斜杠。当然,如果你愿意的话。请给我一点时间。一些附加说明:
-video\u size 1536x864
是一个字符,因此应该在
-i
之前<代码>-crf和
-b:v
是互斥的:只能使用其中一种<代码>-qp被libx264忽略。对于输入设备,应使用
-framerate
输入选项而不是
-r
输出选项设置帧速率,以避免不必要的帧速率转换(gdigrab的默认值为30000/1001)。尾随选项可能会被忽略,因此不要将任何选项置于输出文件名之后。@LordNeckbeard-qp被此处拾取的libx264-->忽略(
rc=cqp
,由x264打印)。
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()