我在Python脚本中运行FFMPEG命令时遇到问题。当我从终端运行以下命令时,我可以从我连接的网络摄像头(Logitech C310)流式传输视频和音频,并输出到文件“out.avi”,没有任何错误。
ffmpeg -f alsa -i default -itsoffset 00:00:00 -f video4linux2 -s 1280x720 -r 25 -i /dev/video0 out.avi
当我在下面的Python脚本中运行相同的命令时,
def call_command(command):
subprocess.Popen(command.split(' '))
call_command("ffmpeg -f alsa -i default -itsoffset 00:00:00 -f video4linux2 -s 1280x720 -r 25 -i /dev/video0 out.avi")
它给了我错误:
Input #0, alsa, from 'default':
Duration: N/A, start: 1317762562.695397, bitrate: N/A
Stream #0.0: Audio: pcm_s16le, 44100 Hz, 1 channels, s16, 705 kb/s
[video4linux2 @ 0x165eb10]Cannot find a proper format for codec_id 0, pix_fmt -1.
/dev/video0: Input/output error
有人能说清楚这里会发生什么吗?我尝试过使用os.system()以及subprocess.call(),它给了我相同的错误。我不知道从哪里开始可能会出现问题。我试着搜索“video4linux2无法找到适当格式的codec_id 0,pix_fmt -1”错误,但找不到任何一致的内容。
我还尝试将“ffmpeg -f ...”命令放在shell脚本“test.sh”中,并赋予它可执行权限。然后我打开终端,然后运行“./test.sh”,它就可以了。当我尝试从我的Python脚本中调用命令“./test.sh”时,我就像以前一样留下了原始错误。这是我尝试使用test.sh脚本的Python命令:
subprocess.call(["./test.sh"])
我已经解决了这个问题。在我的Python脚本中,我使用OpenCV来显示这些帧以及使用ffmpeg记录它们。尝试运行ffmpeg命令并使用OpenCV在屏幕上显示它们时发生冲突。
更具体地说,在创建OpenCV CreateCameraCapture对象时:
from opencv.cv import *
from opencv.highgui import *
capture = cvCreateCameraCapture(0) #conflict with ffmpeg/v4l2 occurs here
注释掉那行代码可以解决我的问题。 Python和执行命令没有任何问题。
您应该尝试使用shell = True参数运行Popen。
subproc = subprocess.popen(command.split(' '), shell=True)
在大多数情况下,Shell =True
不是一个好选择。如果您需要管道作为输出,它不起作用。使用
pipe_stdin=True
它解决了我的问题。