在 django 中使用 FFMPEG 在网络上上传后从视频中提取 WAV 音频文件

Posted

技术标签:

【中文标题】在 django 中使用 FFMPEG 在网络上上传后从视频中提取 WAV 音频文件【英文标题】:Extract WAV audio file from video after uploading on web, using FFMPEG in django 【发布时间】:2019-07-31 10:03:09 【问题描述】:

问题

我正在尝试找到一种方法来从 mp4 视频文件中提取音频 wav 文件,该文件由网络用户使用 Django 使用ffmpeg 上传。

如果我发现要提取音频,那么我应该将它保存在我的项目中的哪个位置?

    我尝试使用“Django-ffmpeg”,但没有转换并卡在“等待转换”消息中。

    然后我尝试了:

    import subprocess
    
    subprocess.call('ffmpeg -i filename.mp4 filename.wav')
    

错误

脚本

def validate_file_extension(值): 导入操作系统 从 django.core.exceptions 导入 ValidationError ext = os.path.splitext(value.name)1 # [0] 返回路径+文件名 filename = os.path.splitext(value.name)1 # [0] 返回路径+文件名 valid_extensions = ['.mp4'] 如果在 valid_extensions 中没有 ext.lower(): raise ValidationError(u'不支持的文件扩展名。') 别的: 导入子流程 subprocess.call('ffmpeg -i filename.mp4 filename.wav')

【问题讨论】:

使用可执行文件的完整路径 @szatmary 如果您一步一步指导如何使用 ffmpeg 命令来处理由网络用户以 mp4 格式上传的可变文件名,我们想从中提取 wav 音频文件。 @szatmary 使用 "inFile = videofile outFile = videofile[:-3] + "wav" cmd = "ffmpeg -i ".format(inFile, outFile) os.popen(cmd )”它给出一个错误“'FieldFile'对象不可下标”。你知道吗? 这行代码的错误“outFile = videofile[:-3] + "wav" ". 我只是用这个 "outFile = os.path.splitext(value.name)[0] + '.wav' " 错误替换 "outFile = videofile[:-3] + "wav" "解决了。​​ 【参考方案1】:

解决方案: - 你可以在Django中这样提取wav音频文件:

def extract_audio(videofile,channels=1, rate=16000):

    your_media_root = settings.MEDIA_ROOT
    path_to_user_folder = your_media_root + videofile.name

    inFile = path_to_user_folder

    temp = tempfile.NamedTemporaryFile(suffix='.wav', delete=False)
    command = ["ffmpeg", "-y", "-i", inFile,
           "-ac", str(channels), "-ar", str(rate),
           "-loglevel", "error", temp.name]
    subprocess.check_output(command)
    print(temp.name)
    return temp.name
其次使用“import tempfile”库来临时存储提取的文件。

【讨论】:

以上是关于在 django 中使用 FFMPEG 在网络上上传后从视频中提取 WAV 音频文件的主要内容,如果未能解决你的问题,请参考以下文章

使用FFmpeg转录网络直播流

使用ffmpeg通过编解码器压缩后从网络摄像头获取所有字节流?

使用ffmpeg进行网络直播

FFmpeg基础库编程开发学习笔记——视频常见格式

使用 ffmpeg 在文件夹中流式传输视频

使用 FFmpeg 从 Mac 流式传输网络摄像头