我遇到了一个小问题:
我有一个网站来管理不同用户的视频文件。每个用户都可以将视频上传到我不想更改的个人文件夹,因为我不想混淆不同用户的文件。上传视频文件后,我调用了一个subprocess
,它应该创建一个缩略图。由于ffmpeg
中的错误,子进程失败,似乎与缺少写入权限有关。上传的文件和包含的文件夹属于www-data。
代码:
command = ("ffmpeg -ss 00:00:10 -i %s -dframes 1 %s -y" % (video_path, image_path)).split()
subprocess.call(command)
FFMPEG似乎作为不同的用户运行,因为它仅在目标文件夹具有777权限时才有效。否则它会失败并显示以下消息:
av_interleaved_write_frame(): I/O error occurred
Usually that means that input file is truncated and/or corrupted.
如果我touch
图像文件而不是通过ffmpeg创建它,那么文件夹是否有775或777并不重要。结果文件也属于www-data,这意味着子进程本身是作为www-data运行的,不是吗?
我考虑创建一个具有777权限的子文件夹,但我不喜欢它有两个原因:必须动态创建此文件夹,因为我希望能够创建新用户(并在我的上传中生成新的子文件夹) -夹)。无论如何,777权限都不是一个好方法。
您是否有任何建议需要更改,以便ffmpeg可以在不打开安全漏洞的情况下写入文件夹而无需在创建新用户/文件夹时触摸任何内容?
答案 0 :(得分:2)
尝试按照here
所述指定-vframes 1
但是,对于ffmpeg 0.9 and later,dframes
和vframes
都是frames
的别名,因此如果您使用较新版本的ffmpeg,问题就会出现在其他地方。
答案 1 :(得分:2)
我找到了它!
这不是权限问题,而是错误处理中的一些奇怪的问题:如果代码是从Web服务器运行的,则在发生错误时会解除生成的图像文件。如果从命令行运行,则生成的文件仍保留在文件夹中。
所以基本上我改变了命令,使用-vframes
而不是-dframes
(在Windows中只能正常工作)不再出现任何错误消息:
command = ("ffmpeg -ss 00:00:10 -i %s -vframes 1 %s -y" % (video_path, image_path)).split()
答案 2 :(得分:1)