Возможно ли поймать ошибки ffmpeg с помощью python?

#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