Проблемы с Python / FFMPEG из командной строки - PullRequest
2 голосов
/ 05 октября 2011

У меня проблема с запуском команды FFMPEG из скрипта Python. Когда я запускаю следующую команду из терминала, я могу передавать потоковое видео и аудио с подключенной веб-камеры (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 ..." в сценарий оболочки "test.sh" и дать ей права на выполнение. Затем я открываю терминал и запускаю «./test.sh», и он работает. Когда я пытаюсь вызвать команду "./test.sh" из моего скрипта Python, у меня остается первоначальная ошибка, как и раньше. Это команда Python, которую я пробовал с помощью скрипта test.sh:

subprocess.call(["./test.sh"])

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Я исправил проблему. В моем скрипте 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 и выполнением команд.

1 голос
/ 05 октября 2011

Вы должны попробовать запустить Popen с аргументом shell = True.

subproc = subprocess.popen(command.split(' '), shell=True)
0 голосов
/ 01 марта 2019

Shell =True не является хорошим вариантом в большинстве случаев.Это не работает, если вам нужна труба в качестве вывода.Используйте

pipe_stdin=True

Это решает проблему для меня.

...