用python捕获ffmpeg错误是可能的吗?

问题描述 投票:0回答:2

嗨我正在尝试使用python为django制作视频转换器,我分叉django-ffmpeg模块,它几乎可以完成我想要的任何事情,除非转换失败时没有捕获错误。

基本上模块传递给命令行界面ffmpeg命令进行如下转换:

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

Module使用此方法将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()

但是,例如,我上传一个损坏的视频文件,它只返回打印在cli上的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输出消息字符串中搜索:“处理输入时找到无效数据”,但如果这是最好的方法,我不会感到害羞。任何人都可以帮助我并指导我。

python video ffmpeg
2个回答
1
投票

您需要检查您正在创建的Popen对象的returncode。检查文档:https://docs.python.org/3/library/subprocess.html#subprocess.Popen

您的代码应该等待子进程完成(使用wait)然后检查returncode。如果returncode!= 0,那么你可以提出你想要的任何例外。


0
投票

这是我实现它的方式,以防它对其他人有用:

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
© www.soinside.com 2019 - 2024. All rights reserved.