3

我遇到了一个小问题:

我有一个网站来管理不同用户的视频文件。每个用户都可以将视频上传到我不想更改的个人文件夹,因为我不想混淆来自不同用户的文件。上传视频文件后,我调用 asubprocess应该创建一个缩略图。子进程因 中的错误而失败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 可以在不打开安全漏洞的情况下写入文件夹,并且在创建新用户/文件夹时无需触摸任何内容?

4

3 回答 3

2

我找到了!

这不是权限问题,而是错误处理中的一些奇怪的东西:如果代码是从网络服务器运行的,则生成的图像文件会在错误发生时被关闭。如果从命令行运行,则生成的文件保留在文件夹中。

所以基本上我改变了我的命令,通过使用-vframes而不是不再出现错误消息-dframes(它只在 Windows 中运行良好):

command = ("ffmpeg -ss 00:00:10 -i %s -vframes 1 %s -y" % (video_path, image_path)).split()
于 2013-11-12T14:06:22.800 回答
2

尝试-vframes 1按照此处所述指定

但是,对于ffmpeg 0.9 及更高版本dframesvframes都是 的别名frames,因此如果您使用较新版本的 ffmpeg,问题就出在其他地方。

于 2013-11-12T10:56:31.773 回答
1

您可以使用Celery异步运行转换过程。您的工作进程可能会以所需的权限调用,而 apache 只需要访问通信通道的权限,例如RabbitMQ

于 2013-11-06T09:02:37.200 回答