Python/FFMPEG命令行问题
我在用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 Cannot find a proper format for codec_id 0, pix_fmt -1”这个错误,但没有找到什么有用的信息。
我还尝试把“ffmpeg -f...”命令放到一个名为“test.sh”的脚本里,并给它设置可执行权限。然后我打开终端,运行“./test.sh”,结果是可以正常工作的。但是当我在我的Python脚本中调用这个命令“./test.sh”时,还是出现了之前的错误。这是我在尝试使用test.sh脚本时的Python命令:
subprocess.call(["./test.sh"])
3 个回答
0
Shell =True
在大多数情况下不是一个好的选择。因为如果你需要将输出通过管道传递,这个选项就不管用了。建议使用
pipe_stdin=True
这样可以解决我的问题。
1
你可以试着用参数 shell=True 来运行 Popen。
subproc = subprocess.popen(command.split(' '), shell=True)
3
我已经解决了这个问题。在我的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和执行命令之间没有任何问题。