Возможно ли отлавливать ошибки ffmpeg с помощью python? - PullRequest
0 голосов
/ 04 апреля 2019

Привет, я пытаюсь сделать видео конвертер для django с python, я разветвил модуль django-ffmpeg , который делает почти все, что я хочу, за исключением того, что не ловит ошибку, если преобразование не удалось.

Обычно модуль передает интерфейсу командной строки команду ffmpeg, чтобы выполнить преобразование следующим образом:

/ usr / bin / ffmpeg -hide_banner -nostats -i% (input_file) s -target film-dvd% (output_file)

Модуль использует этот метод для передачи команды 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, напечатанное на cli, но ничего не вызывается, чтобы узнать, что что-то не удалось

Это пример вывода ffmpeg, когда преобразование не удалось:

[mov, mp4, m4a, 3gp, 3g2, mj2 @ 0x237d500] Формат MOV, MP4, m4a, 3gp, 3g2, mj2 обнаруживается только при низком значении 1, возможно неправильное обнаружение! [mov, mp4, m4a, 3gp, 3g2, mj2 @ 0x237d500] атом moov не найден /home/user/PycharmProjects/videotest/media/videos/orig/270f412927f3405aba041265725cdf6b.mp4: Найдены неверные данные при обработке ввода

Мне было интересно, есть ли способ сделать это исключение и каким образом, чтобы я мог справиться с этим легко.

Единственная опция, которая пришла мне в голову, - это поиск: «Обнаружены недопустимые данные при обработке ввода» в строке сообщения о выводе cli, но я не уверен, что это лучший подход. Любой может помочь мне и направить меня в этом, пожалуйста.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Вам необходимо проверить returncode объекта Popen, который вы создаете.Проверьте документы: https://docs.python.org/3/library/subprocess.html#subprocess.Popen

Ваш код должен дождаться завершения подпроцесса (с wait), а затем проверьте returncode.Если returncode равно != 0, вы можете вызвать любое исключение.

0 голосов
/ 04 апреля 2019

Вот как я это реализовал, если это кому-то пригодится:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...