深入详解Python如何获取音视频时长

文章目录
  • 在音频处理和数据分析中,获取音频文件的时长是一项基础但关键的任务。无论是统计音乐库的总播放时间、分析语音数据,还是开发多媒体应用,都需要精确获取音频时长。Python作为一门功能强大的编程语言,提供了多种库和工具来实现这一目标。本文将详细介绍如何使用Python获取音频时长的常见方法,并通过代码示例和对比分析帮助读者选择最适合的方案。
  • 目录

    pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    上代码:获取音视频时长.py

    # -*- coding: utf-8 -*-
    from moviepy.editor import VideoFileClip
    # import moviepy.editor.VideoFileClip
    import os
    import time
    
    def get_time(seconds):
        hour = seconds // 3600  #ok,向下取整
        if len(str(hour)) != 2:
            hour2 = "0" + str(hour)
        else:
            hour2 = str(hour)
        miniute = (seconds - hour * 3600) // 60 #取余
        if len(str(miniute)) != 2:
            miniute2 = "0" + str(miniute)
        else:
            miniute2 = str(miniute)
        second = seconds - hour * 3600 - miniute * 60
        if len(str(second)) == 1:
            second2 = "0" + str(second)
        else:
            second2 = str(second)
        return str(hour2) + ":"+ str(miniute2) + ":" + str(second2)
    
    #得到文件夹下的所有文件
    def file_name(file_dir,file_type):
        L=[]
        for root, dirs, files in os.walk(file_dir):
            for file in files:
                # if os.path.splitext(file)[1] == '.wmv':
                if os.path.splitext(file)[1] == file_type:
                    L.append(os.path.join(root, file))
        return L
    
    # 得到日期格式
    # def get_date_string_file():
    #     # return time.strftime("%Y%m%d_%H%M%S",time.localtime())
    #     return time.strftime("%Y%m%d", time.localtime())
    
    # 在制定目录创建文件,存在的话就追加写入
    def create_text_file(log_file_name,content):
        with open(log_file_name, 'a+') as f:
            f.write(content + 'n')  # 加n换行显示
            f.close()
    
    # file_dir = "D:/wmv"
    # file_type = '.wmv'
    file_dir = input("请输入文件目录,例如:'D:/wmv':")
    file_type = input("请输入文件扩展名,例如:'.wmv':")
    log_file_name = input("请输入日志文件存放目录,例如:'D:/20220115.log':")
    # log_file_name = "D:/" + get_date_string_file() + '.txt'
    total_times = 0
    for file in file_name(file_dir,file_type):
        # print(file)
        # file = "D:/Video_2022-01-08_011427.wmv"
        clip = VideoFileClip(file)
        times = str(clip.duration)
        # times = times.splitlines()[-1].strip()
        # # print(times)
        # # print(int(float(times)))
        file_time = get_time(int(float(times)))
        print(file + " 文件时长:" + file_time)
        create_text_file(log_file_name, file + " 文件时长:" + file_time)
        total_times = total_times + int(float(times))
        # print(file+ " 文件时长:" + str(total_times))
    # print("total_times = "+ str(total_times))
    print("总时间为:"+get_time(total_times))
    create_text_file(log_file_name, "总时间为:"+get_time(total_times))
    file_type = input("程序执行完毕,请按任意键退出...")
    

    打包exe

    pyinstaller -F 获取音视频时长.py

    在音频处理和数据分析中,获取音频文件的时长是一项基础但关键的任务。无论是统计音乐库的总播放时间、分析语音数据,还是开发多媒体应用,都需要精确获取音频时长。Python作为一门功能强大的编程语言,提供了多种库和工具来实现这一目标。本文将详细介绍如何使用Python获取音频时长的常见方法,并通过代码示例和对比分析帮助读者选择最适合的方案。

    音频时长的基本概念

    音频时长是指音频文件从开始到结束的播放时间,通常以秒(s)为单位。其计算方式取决于音频文件的编码格式和元数据存储方式。例如:

    • WAV文件:通过采样率和帧数计算(时长 = 帧数 / 采样率)。
    • MP3文件:通过ID3标签或比特率计算。
    • M4A文件:依赖容器格式的元数据。

    获取时长的核心方法

    获取音频时长的核心思路是读取文件的元数据或解析音频流。常见的实现方式包括:

    • 读取元数据:通过ID3标签、FFmpeg等工具直接提取时长信息。
    • 解析音频流:通过采样率、比特率等参数计算时长。
    • 第三方库封装:利用现成的Python库简化操作。

    使用mutagen库

    安装与简介

    mutagen 是一个用于处理音频元数据的Python库,支持多种格式(MP3、FLAC、WAV等)。它通过解析文件头信息快速获取时长。

    pip install mutagen
    

    代码示例

    from mutagen.mp3 import MP3
    
    def get_duration_mutagen(file_path):
        audio = MP3(file_path)
        return audio.info.length  # 返回以秒为单位的时长
    
    file_path = "example.mp3"
    duration = get_duration_mutagen(file_path)
    print(f"音频时长: {duration} 秒")
    

    优点与限制

    • 优点:
      • 支持多种音频格式。
      • 无需安装外部工具。
    • 限制:
      • 对非标准格式的支持可能有限。

    使用pydub库

    安装与简介

    pydub 是一个强大的音频处理库,依赖 ffmpeg 或 libav 工具。它通过加载音频文件并计算总帧数来获取时长。

    pip install pydub
    # 需要安装 ffmpeg(Linux/macOS)或 libav(Windows)
    

    代码示例

    from pydub import AudioSegment
    
    def get_duration_pydub(file_path):
        audio = AudioSegment.from_file(file_path)
        return len(audio) / 1000.0  # 毫秒转秒
    
    file_path = "example.wav"
    duration = get_duration_pydub(file_path)
    print(f"音频时长: {duration} 秒")
    

    优点与限制

    • 优点:
      • 支持几乎所有常见格式(MP3、WAV、M4A等)。
      • 提供丰富的音频处理功能(如剪切、合并)。
    • 限制:
      • 需要安装 ffmpeg。
      • 对超大文件(>4GB)可能无法处理。

    使用librosa库

    安装与简介

    librosa 是专为音乐和音频分析设计的库,适合需要高精度分析的场景。

    pip install librosa
    

    代码示例

    import librosa
    
    def get_duration_librosa(file_path):
        audio, sr = librosa.load(file_path)
        return librosa.get_duration(y=audio, sr=sr)
    
    file_path = "example.wav"
    duration = get_duration_librosa(file_path)
    print(f"音频时长: {duration} 秒")
    

    优点与限制

    • 优点:
      • 高精度分析(适合科研和工程场景)。
      • 支持复杂音频特征提取。
    • 限制:
      • 需要加载整个音频文件到内存。
      • 对非WAV格式需要额外转换。

    使用wave模块(仅限WAV文件)

    代码示例

    import wave
    
    def get_duration_wave(file_path):
        with wave.open(file_path, 'rb') as wav_file:
            frames = wav_file.getnframes()
            rate = wav_file.getframerate()
            return frames / float(rate)
    
    file_path = "example.wav"
    duration = get_duration_wave(file_path)
    print(f"音频时长: {duration} 秒")
    

    优点与限制

    • 优点:
      • Python标准库,无需额外安装。
    • 限制:
      • 仅支持WAV格式。
      • 功能单一,扩展性差。

    使用ffmpeg工具

    安装与简介

    ffmpeg 是一个开源多媒体处理工具,通过命令行调用可获取音视频元数据。

    # 安装 ffmpeg
    sudo apt-get install ffmpeg  # Linux
    brew install ffmpeg          # macOS
    

    代码示例

    import subprocess
    
    def get_duration_ffmpeg(file_path):
        result = subprocess.run(
            ["ffprobe", "-v", "error", "-show_entries", "format=duration",
             "-of", "default=noprint_wrappers=1:nokey=1", file_path],
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT
        )
        return float(result.stdout.decode())
    
    file_path = "example.mp4"
    duration = get_duration_ffmpeg(file_path)
    print(f"音频时长: {duration} 秒")
    

    优点与限制

    • 优点:
      • 支持几乎所有音视频格式。
      • 功能全面,适合复杂处理。
    • 限制:
      • 依赖外部工具,需安装 ffmpeg。
      • 调用方式较复杂。

    方法对比与选择建议

    方法 支持格式 依赖项 优点 缺点
    mutagen MP3, FLAC, WAV 无 简单易用,支持多格式 对非标准格式支持有限
    pydub 所有常见格式 ffmpeg 功能丰富,处理灵活 需要安装外部工具
    librosa WAV, MP3 无 高精度分析,适合科研场景 内存占用高
    wave WAV 无 标准库,无需额外安装 仅限WAV格式
    ffmpeg 所有音视频格式 ffmpeg 功能全面,支持复杂处理 调用复杂,依赖外部工具

    1.批量统计文件夹内音频总时长

    import os
    from pydub import AudioSegment
    
    def total_duration_in_folder(folder_path):
        total = 0.0
        for filename in os.listdir(folder_path):
            if filename.endswith((".mp3", ".wav", ".m4a")):
                file_path = os.path.join(folder_path, filename)
                audio = AudioSegment.from_file(file_path)
                total += len(audio) / 1000.0
        return total
    
    folder_path = "audio_files"
    total = total_duration_in_folder(folder_path)
    print(f"总时长: {total / 3600:.2f} 小时")
    

    2.音频质量检测

    在语音识别或音乐推荐系统中,可能需要过滤掉时长过短或过长的音频文件。例如:

    def filter_audio_by_duration(file_path, min_duration, max_duration):
        duration = get_duration_pydub(file_path)
        if min_duration <= duration <= max_duration:
            return True
        return False
    

    3.多媒体播放器开发

    在开发播放器时,获取音频时长是进度条设计的基础。结合 pydub 和 GUI 工具包(如 tkinter),可以实现动态进度显示。

    小结

    获取音频时长是音频处理中的基础任务,Python 提供了多种方法满足不同需求。以下是关键结论:

    • 简单快速:使用 mutagen 或 pydub 可快速实现,适合日常需求。
    • 高精度分析:librosa 提供科研级精度,适合需要深度分析的场景。
    • 兼容性要求:ffmpeg 是全能工具,支持所有格式,但需安装外部依赖。
    • 格式限制:wave 模块仅限WAV文件,适合特定场景。

    在实际开发中,应根据具体需求选择合适的方法。例如,处理WAV文件时优先使用 wave 模块;需要兼容多种格式时选择 pydub 或 ffmpeg;进行科研分析时使用 librosa。通过灵活组合这些工具,可以高效完成音频时长的获取与处理任务。

    到此这篇关于深入详解Python如何获取音视频时长的文章就介绍到这了,更多相关Python获取音视频时长内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python使用OpenCV实现获取视频时长的小工具
    • python3获取视频文件播放时长的三种方法
    • Python实现统计mp4/avi视频的时长
    • 详解Python如何获取视频文件的大小和时长
    • Python爬取视频时长场景实践示例
    • Python实现获取视频时长功能

    站内搜索