我有一个基于Django的媒体服务器,可以接受各种视频格式进行上传。在上传一个很大的.wmv文件时,我注意到了一些奇怪的行为。我第一次上传视频时,花了将近五分钟的时间进行转换和上传。之后,发生了某种缓存,视频只指向我之前上传的视频。我不明白为什么会发生这种事。当上传视频时,为了进行转换,会检查文件扩展名,然后执行ffmpeg命令来执行转换。这一切都是异步运行的,使用django-celey和RabbitMQ作为消息代理。我看不出有什么理由不能再次执行ffmpeg转换命令。这是我为处理上传的芹菜任务编写的代码。(这是我最初的推理,查看EDIT以获得正确的错误诊断)
@celery.task
def handleFileUploadAsync(update, m, file_type, video_types):
filename = m.file.name.replace(' ', '\ ')
if video_types[file_type] == 'wmv':
os.system(
"ffmpeg -i " + MEDIA_ROOT + filename + " -strict experimental -vcodec libx264 -profile:v baseline " + MEDIA_ROOT + filename.replace(video_types[file_type],'mp4')
)
m.file.name = m.file.name.replace(video_types[file_type], 'mp4')
m.save()
os.remove(m.file.path.replace('mp4', 'wmv'))
elif file_type in video_types.keys():
os.system(
"ffmpeg -i " + MEDIA_ROOT + filename + " -vcodec libx264 -profile:v baseline -s 672x576 " + MEDIA_ROOT + filename.replace(video_types[file_type],'mp4')
)
m.file.name = m.file.name.replace(video_types[file_type], 'mp4')
m.save()
if video_types[file_type] != 'mp4':
os.remove(m.file.path.replace('mp4', video_types[file_type]))
编辑:
问题来了。当我转换视频时,我只想要转换后的.mp4文件,而不是原始上传。Django从文件上传字段生成文件名,自动将数字附加到现有文件的末尾(即test.mp4、test_1.mp4和test_2.mp4等)。但是,当我上传像test.wmv这样的视频时,在转换完成后将不会有名为test.wmv的文件(我删除了未转换的文件)。有什么方法可以修改生成这些文件名的Django方法吗??
在声明FileField时使用upload_to。也许使用对象的主键作为文件名?