Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
它';用python捕捉ffmpeg错误是可能的吗?_Python_Video_Ffmpeg - Fatal编程技术网

它';用python捕捉ffmpeg错误是可能的吗?

它';用python捕捉ffmpeg错误是可能的吗?,python,video,ffmpeg,Python,Video,Ffmpeg,嗨,我正在尝试用python为django制作一个视频转换器,我分叉了一个模块,它几乎可以完成我想要的所有事情,除了在转换失败时不会捕获错误 基本上,模块将ffmpeg命令传递到命令行界面,以进行如下转换: /usr/bin/ffmpeg-hide_banner-nostats-i%(输入文件)s-target 胶片dvd%(输出文件) 模块使用此方法将ffmpeg命令传递给cli并获取输出: def _cli(self, cmd, without_output=False): prin

嗨,我正在尝试用python为django制作一个视频转换器,我分叉了一个模块,它几乎可以完成我想要的所有事情,除了在转换失败时不会捕获错误

基本上,模块将ffmpeg命令传递到命令行界面,以进行如下转换:

/usr/bin/ffmpeg-hide_banner-nostats-i%(输入文件)s-target 胶片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()
但是,例如,我上传了一个损坏的视频文件,它只返回打印在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原子 /home/user/pycharm项目/videotest/media/videos/orig/270f412927f3405aba041265725cdf6b.mp4: 处理输入时发现无效数据

我想知道是否有什么方法可以让它成为一个例外,以及如何让它变得简单


我想到的唯一选择是在cli输出消息字符串中搜索:“处理输入时发现无效数据”,但我不是舒尔,如果这是最佳方法。任何人都可以帮助我并指导我。你需要检查你正在创建的Popen对象的
returncode
。 检查文档:


您的代码应该等待子流程完成(使用
wait
),然后检查
returncode
。如果
返回代码
!=0
然后您可以引发任何需要的异常

您需要检查正在创建的Popen对象的
returncode
。 检查文档:


您的代码应该等待子流程完成(使用
wait
),然后检查
returncode
。如果
返回代码
!=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

我就是这样实现的,以防对其他人有用:

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