MUSIC_AVQA复现(1)——数据预处理

从视频中提取音频——MoviePy

示例代码:MUSIC-AVQA/extract_audio.py at main · GeWu-Lab/MUSIC-AVQA (github.com)

时间:2023年3月3日

目录

一、概述

二、音视频加载及输出方法

2.1 视频加载方法

2.2 音频加载方法

2.3 视频输出方法

2.4 音频输出方法

三、参数释义

四、Extract_audio.py


一、概述

在本地进行音视频处理时,首先要从视频文件进行音视频加载,最后要将处理结果输出到文件。本节介绍moviepy的音视频的加载和输出方法。

二、音视频加载及输出方法

2.1 视频加载方法

使用VideoFileClip类的构造方法即可完成加载。其构造方法语法如下:

VideoFileClip(self, filename, has_mask=False,
              audio=True, audio_buffersize=200000,
              target_resolution=None, resize_algorithm='bicubic',
              audio_fps=44100, audio_nbytes=2, verbose=False,
              fps_source='tbr')

2.2 音频加载方法

使用AudioFileClip类的构造方法即可完成加载。其构造方法语法如下:

AudioFileClip(self, filename, buffersize=200000, nbytes=2, fps=44100):

相关参数的含义除了filename指向音频文件外,其他与VideoFileClip对应参数含义一致,nbytes对应VideoFileClipaudio_nbytes。返回值为一个AudioFileClip对象

2.3 视频输出方法

视频输出的方法为VideoFileClipwrite_videofile方法,语法如下:

def write_videofile(self, filename, fps=None, codec=None,
                        bitrate=None, audio=True, audio_fps=44100,
                        preset="medium",
                        audio_nbytes=4, audio_codec=None,
                        audio_bitrate=None, audio_bufsize=2000,
                        temp_audiofile=None,
                        rewrite_audio=True, remove_temp=True,
                        write_logfile=False, verbose=True,
                        threads=None, ffmpeg_params=None,
                        logger='bar')

2.4 音频输出方法

音频的输出调用AudioFileClipwrite_audiofile方法,具体语法如下:

write_audiofile(self, filename, fps=None, nbytes=2, buffersize=2000,
                        codec=None, bitrate=None, ffmpeg_params=None,
                        write_logfile=False, verbose=True, logger='bar')

三、参数释义

  • filename:视频文件名/视频存储的地址,只要是ffmpeg支持的视频文件如 .ogv, .mp4, .mpeg, .avi, .mov等都可以

  • has_mask:如果视频文件中包含遮罩该参数设置为“True”。遮罩:划出一个区域,让这个区域之外的地方显示为透明,可以直接显示下层轨道的图像。

  • audio:如果视频没有声音或者希望加载时不读取音频,则应该将audio设置为False

  • audio_buffersize:音频缓冲区大小,一般使用缺省值即可

  • target_resolution:设置为加载后需要变换到的分辨率,类型为列表或元组,第一个元素为分辨率的高,第二个为宽,如果高或宽有一个为None,则保持现有纵横比调整帧的大小。如果保持原分辨率不变,则不需要设置本参数或设置为None。如果设置了新的分辨率,则在调用ffmpeg 返回视频剪辑的帧之前会按新的分辨率调整帧的大小。这比使用转换为高分辨率流然后再调整分辨率会快很多

  • resize_algorithm:要改变加载后的视频分辨率,可以通过resize_algorithm指定调整分辨率的算法,缺省值为 “bicubic”,还可以是 “bilinear” 、"fast_bilinear"等。关于算法的更多信息请参考:FFmpeg Scaler Documentation

  • audio_fps:声音的采样频率

  • audio_nbytes:采样的位数

  • verbose:是否在标准输出设备上显示处理信息

  • fps_source:从视频的元数据metadata哪个数据中获取fps值,默认设置为’tbr’,但可以设置为’fps’,这可能有助于导入慢动作视频,否则会弄糟。

  • codec:用于图像编码的编解码器,可以是ffmpeg支持的任何编解码器。如果文件名的扩展名为“.mp4”、“.ogv”、“.webm”,则会相应地设置编解码器,但如果不喜欢默认值,则仍可以进行设置。对于其他扩展名,必须相应地设置输出文件名。一些常用的编解码器如下:

    1. ‘libx264’:视频压缩效果好的一款编解码器,MP4的缺省编解码器,视频质量通过bitrate参数调节
    2. ‘mpeg4’:一种可选的MP4编解码器,可以替代’libx264’,可以获得更好的视频质量
    3. ‘rawvideo’:完美的视频质量,但文件会巨大,对应视频文件为’.avi’
    4. ‘png’:完美的视频质量,对应视频文件为’.avi’,但文件大小比’rawvideo’小
    5. ‘libvorbis’:是一种完全开放、免费的编解码器,有不错的视频格式,但是要不广,对应视频文件为’.ogv’
    6. ‘libvpx’:一种很适合在HTML5中使用的网络视频轻量级编开源解码器,对应视频文件为’.webm’ ​
  • audio:可以为True、False或文件名,如果True且剪辑附加了音频,则音频将作为视频的音频保存,如果为False则不保存音频,如果为音频文件名则将此音频文件将作为视频的音频

  • temp_audiofile:如果输出由音频,则该参数用于指定要生成并合并到电影中的临时音频文件的名称,如果没有指定则用缺省模式的临时文件名

  • audio_codec:音频解码器,例如’.mp3’的’libmp3lame’、‘ogg’的’libvorbis’、 ‘m4a’的’libfdk_aac’、 ‘pcm_s16le’ 16位声音和’pcm_s32le’的32位声音。默认值为“libmp3lame”,除非视频扩展名为“ogv”或“webm”,在这2种情况下,默认值为“libvorbis”。

  • audio_bitrate:音频比特率,字符串形式,如“50k”、“500k”、“3000k”,用于将确定输出文件中音频的大小/质量。请注意,这主要是一个指示性目标,输出文件的比特率不一定会按此设置。

  • preset:设置FFMPEG用于优化压缩的时间。字符串类型,可选值有:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、 placebo。请注意,这不会影响视频的质量,只影响视频文件的大小。所以如果赶时间而文件大小不是很重要可以设置为ultrafast

  • threads:用于ffmpeg的线程数,可以加快多核计算机上视频输出的速度

  • ffmpeg_params:需要额外传递的任何其他ffmpeg参数,使用列表传递,形如:[’-option1’,‘value1’,’-option2’,‘value2’]

  • write_logfile:如果为True,将为音频和视频输出记录日志文件。日志文件将以“.log”结尾,包含输出文件的名称

  • logger:字符串类型,"bar"表示进度条、None 表示不设置、或任何程序日志记录器的名字

  • verbose:已经废弃使用,留下来是为了兼容性,以前用于打开/关闭消息。现在使用logger=None。

四、Extract_audio.py

import os
from moviepy.editor import VideoFileClip
​
'''
Function: Extract audio files(.wav) from videos.从视频中提取音频文件(.wav)
'''
​
def get_audio_wav(name, save_pth, audio_name):
​
    video = VideoFileClip(name)     #读取视频文件至video
    audio = video.audio             #将video中的音频文件重命名为audio
​
    #write_audiofile()函数用于实现音频输出,fps——每秒传输帧数
    #os.path.join()函数用于文件路径拼接
    audio.write_audiofile(os.path.join(save_pth, audio_name), fps=16000)
​
'''if语句之前的代码可被引用执行,if语句之后的代码只有该文件作为脚本时才运行'''
if __name__ == "__main__":
​
    time1 = time.time()
​
    video_pth =  "D:\MUSIC-AVQA\\test-videos"        #视频存储路径
    save_pth =  "D:\MUSIC-AVQA\\test-audios"                    #音频保存路径
​
    sound_list = os.listdir(video_pth)              #os.listdir() 用于返回指定的文件夹包含的文件或文件夹的名字的列表
    for audio_id in sound_list:
        name = os.path.join(video_pth, audio_id)    # name:视频路径+id
        audio_name = audio_id[:-4] + '.wav'         # 字符串从后往前截取4个字符,即删除了‘.mp4’;并添加.wav后缀
        exist_lis = os.listdir(save_pth)
        if audio_name in exist_lis:                 
            print("already exist!")
            continue                                #若音频文件已存在,则退出本次循环,继续执行循环体
        try:
            # 调用自定义函数,用于实现音频输出
            # name:视频保存路径,save_path:音频保存路径,audio_name:音频名称
            get_audio_wav(name, save_pth, audio_name)
            print("finish video id: " + audio_name)
        except:
            print("cannot load ", name)
​
    print("\n------------------------------ end -------------------------------\n")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值