Python/FFMPEG 命令行问题
Posted
技术标签:
【中文标题】Python/FFMPEG 命令行问题【英文标题】:Python/FFMPEG command line issues 【发布时间】:2011-12-01 03:52:59 【问题描述】:我在 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...”命令放在 shell 脚本“test.sh”中,并赋予它可执行权限。然后我打开终端,运行“./test.sh”,它就可以工作了。当我尝试从我的 Python 脚本中调用命令“./test.sh”时,我仍然像以前一样遇到原始错误。这是我使用 test.sh 脚本尝试的 Python 命令:
subprocess.call(["./test.sh"])
【问题讨论】:
您在 python 中的调用可能指向不同路径中不同版本的 ffmpeg。尝试ffmpeg -version
并检查它们是否输出相同的内容。
我刚刚尝试了你的建议,它们都指向同一个版本,FFmpeg 0.6.2-4:0.6.2-1ubuntu1.1 谢谢,至少这个问题被排除了。
【参考方案1】:
您应该尝试使用 shell=True 参数运行 Popen。
subproc = subprocess.popen(command.split(' '), shell=True)
【讨论】:
FFmpeg 里面有很多黑魔法。如果连接到标准输入/标准输出管道而不是真正的终端,它很可能会以不同的方式处理命令行。我也想知道使用两个-i
参数。
已经试过了。不工作。脚本退出,吐出 FFmpeg 版本号,它是库,还有:Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... [outfile options] outfile...使用 -h 获得全面帮助,或者更好的是,运行 'man ffmpeg'
你能用 os.system() 代替吗?像 os.system(r'ffmpeg.exe -i "%s" "%s"'%(path+f,path+outf)) 这样的东西只是为了明确这不是 Python 的错。【参考方案2】:
我已经解决了这个问题。在我的 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 和执行命令没有任何问题。
【讨论】:
如果您已经解决了问题,请不要忘记接受这个答案。【参考方案3】:Shell =True
在大多数情况下不是一个好的选择。
如果您需要管道作为输出,它不起作用。
使用
pipe_stdin=True
它为我解决了问题。
【讨论】:
以上是关于Python/FFMPEG 命令行问题的主要内容,如果未能解决你的问题,请参考以下文章