嗨,我正在尝试使用python为django创建视频转换器,我分叉了django-ffmpeg模块,该模块几乎可以完成我想要的所有操作,但是如果转换失败,该模块不会捕获错误。
基本上,该模块将ffmpeg命令传递到命令行界面以进行如下转换:
/ usr / bin / ffmpeg -hide_banner -nostats -i%(input_file)s -target 电影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()
但是,例如,我上传了一个损坏的视频文件,它仅返回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/PycharmProjects/videotest/media/videos/orig/270f412927f3405aba041265725cdf6b.mp4: 处理输入时发现无效数据
我想知道是否有任何方法可以使该异常以及如何使其成为异常,因此我可以轻松地对其进行处理。
我想到的唯一选择是在cli输出消息字符串中搜索:“处理输入时发现无效数据”,但是我不确定这是否是最佳方法。任何人都可以帮助我并指导我。
答案 0 :(得分:1)
您需要检查正在创建的Popen对象的returncode
。
检查文档:https://docs.python.org/3/library/subprocess.html#subprocess.Popen
您的代码应等待子过程完成(使用wait
),然后检查returncode
。如果returncode
是!= 0
,则可以引发任何所需的异常。
答案 1 :(得分: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