Python/FFMPEG命令行问题

2 投票
3 回答
4715 浏览
提问于 2025-04-17 03:41

我在用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和执行命令之间没有任何问题。

撰写回答