#python #video #ffmpeg
#python #Видео #ffmpeg
Вопрос:
Привет, я пытаюсь создать видео конвертер для django с помощью python, я раздвоил модуль django-ffmpeg, который делает почти все, что я хочу, за исключением того, что не улавливает ошибку, если преобразование не удалось.
В основном модуль передает в интерфейс командной строки команду ffmpeg, чтобы выполнить преобразование следующим образом:
/usr/bin/ffmpeg -hide_banner -nostats -i % (входной файл)s -целевой фильм-dvd % (выходной файл)
Модуль использует этот метод для передачи команды ffmpeg в cli и получения выходных данных:
def _cli(self, cmd, without_output=False):
print 'cli'
if os.name == 'posix':
import commands
return commands.getoutput(cmd)
else:
import subprocess
if without_output:
DEVNULL = open(os.devnull, 'wb')
subprocess.Popen(cmd, stdout=DEVNULL, stderr=DEVNULL)
else:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
return p.stdout.read()
Но, например, если вы загружаете поврежденный видеофайл, он возвращает только сообщение ffmpeg, напечатанное в командной строке, но ничего не запускается, чтобы узнать, что что-то не удалось
Это пример вывода ffmpeg при сбое преобразования:
[mov, mp4, m4a, 3gp, 3g2, mj2 @ 0x237d500] Формат mov, mp4, m4a, 3gp, 3g2, mj2 обнаружен только с низким показателем 1, возможно неправильное обнаружение! [mov, mp4, m4a, 3gp, 3g2, mj2 @ 0x237d500] moov atom не найден /home/user/ PycharmProjects/videotest/media/videos/orig/ 270f412927f3405aba041265725cdf6b.mp4: неверные данные, обнаруженные при обработке ввода
Мне было интересно, есть ли какой-либо способ сделать это исключением и как, чтобы я мог легко с этим справиться.
Единственный вариант, который пришел мне на ум, — это выполнить поиск: «Неверные данные, обнаруженные при обработке ввода» в строке выходного сообщения cli, но я не уверен, что это лучший подход. Кто-нибудь может помочь мне и направить меня в этом, пожалуйста.
Ответ №1:
Вам нужно проверить returncode
создаваемый вами Popen-объект. Проверьте документы:https://docs.python.org/3/library/subprocess.html#subprocess .Всплывающее
Ваш код должен дождаться завершения подпроцесса (с wait
), а затем проверить returncode
. Если returncode
есть != 0
, то вы можете вызвать любое исключение, которое хотите.
Ответ №2:
Вот как я это реализовал на случай, если это пригодится кому-то еще:
def _cli(self, cmd):
errors = False
import subprocess
try:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
stdoutdata, stderrdata = p.communicate()
if p.wait() != 0:
# Handle error / raise exception
errors = True
print "There were some errors"
return stderrdata, errors
print 'conversion success '
return stderrdata, errors
except OSError as e:
errors = True
return e.strerror, errors