深入詳解Python如何獲取音視頻時(shí)長(zhǎng)
Python獲取音視頻時(shí)長(zhǎng)
1、安裝插件
pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple
2、獲取音視頻時(shí)長(zhǎng).py
上代碼:獲取音視頻時(shí)長(zhǎng).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())
# 在制定目錄創(chuàng)建文件,存在的話(huà)就追加寫(xiě)入
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("請(qǐng)輸入文件目錄,例如:'D:/wmv':")
file_type = input("請(qǐng)輸入文件擴(kuò)展名,例如:'.wmv':")
log_file_name = input("請(qǐng)輸入日志文件存放目錄,例如:'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 + " 文件時(shí)長(zhǎng):" + file_time)
create_text_file(log_file_name, file + " 文件時(shí)長(zhǎng):" + file_time)
total_times = total_times + int(float(times))
# print(file+ " 文件時(shí)長(zhǎng):" + str(total_times))
# print("total_times = "+ str(total_times))
print("總時(shí)間為:"+get_time(total_times))
create_text_file(log_file_name, "總時(shí)間為:"+get_time(total_times))
file_type = input("程序執(zhí)行完畢,請(qǐng)按任意鍵退出...")
打包exe
pyinstaller -F 獲取音視頻時(shí)長(zhǎng).py
Python獲取音頻時(shí)長(zhǎng):從基礎(chǔ)到高級(jí)方法
在音頻處理和數(shù)據(jù)分析中,獲取音頻文件的時(shí)長(zhǎng)是一項(xiàng)基礎(chǔ)但關(guān)鍵的任務(wù)。無(wú)論是統(tǒng)計(jì)音樂(lè)庫(kù)的總播放時(shí)間、分析語(yǔ)音數(shù)據(jù),還是開(kāi)發(fā)多媒體應(yīng)用,都需要精確獲取音頻時(shí)長(zhǎng)。Python作為一門(mén)功能強(qiáng)大的編程語(yǔ)言,提供了多種庫(kù)和工具來(lái)實(shí)現(xiàn)這一目標(biāo)。本文將詳細(xì)介紹如何使用Python獲取音頻時(shí)長(zhǎng)的常見(jiàn)方法,并通過(guò)代碼示例和對(duì)比分析幫助讀者選擇最適合的方案。
音頻時(shí)長(zhǎng)的定義與獲取原理
音頻時(shí)長(zhǎng)的基本概念
音頻時(shí)長(zhǎng)是指音頻文件從開(kāi)始到結(jié)束的播放時(shí)間,通常以秒(s)為單位。其計(jì)算方式取決于音頻文件的編碼格式和元數(shù)據(jù)存儲(chǔ)方式。例如:
- WAV文件:通過(guò)采樣率和幀數(shù)計(jì)算(
時(shí)長(zhǎng) = 幀數(shù) / 采樣率)。 - MP3文件:通過(guò)ID3標(biāo)簽或比特率計(jì)算。
- M4A文件:依賴(lài)容器格式的元數(shù)據(jù)。
獲取時(shí)長(zhǎng)的核心方法
獲取音頻時(shí)長(zhǎng)的核心思路是讀取文件的元數(shù)據(jù)或解析音頻流。常見(jiàn)的實(shí)現(xiàn)方式包括:
- 讀取元數(shù)據(jù):通過(guò)ID3標(biāo)簽、FFmpeg等工具直接提取時(shí)長(zhǎng)信息。
- 解析音頻流:通過(guò)采樣率、比特率等參數(shù)計(jì)算時(shí)長(zhǎng)。
- 第三方庫(kù)封裝:利用現(xiàn)成的Python庫(kù)簡(jiǎn)化操作。
常用方法及代碼實(shí)現(xiàn)
使用mutagen庫(kù)
安裝與簡(jiǎn)介
mutagen 是一個(gè)用于處理音頻元數(shù)據(jù)的Python庫(kù),支持多種格式(MP3、FLAC、WAV等)。它通過(guò)解析文件頭信息快速獲取時(shí)長(zhǎng)。
pip install mutagen
代碼示例
from mutagen.mp3 import MP3
def get_duration_mutagen(file_path):
audio = MP3(file_path)
return audio.info.length # 返回以秒為單位的時(shí)長(zhǎng)
file_path = "example.mp3"
duration = get_duration_mutagen(file_path)
print(f"音頻時(shí)長(zhǎng): {duration} 秒")
優(yōu)點(diǎn)與限制
- 優(yōu)點(diǎn):
- 支持多種音頻格式。
- 無(wú)需安裝外部工具。
- 限制:
- 對(duì)非標(biāo)準(zhǔn)格式的支持可能有限。
使用pydub庫(kù)
安裝與簡(jiǎn)介
pydub 是一個(gè)強(qiáng)大的音頻處理庫(kù),依賴(lài) ffmpeg 或 libav 工具。它通過(guò)加載音頻文件并計(jì)算總幀數(shù)來(lái)獲取時(shí)長(zhǎng)。
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 # 毫秒轉(zhuǎn)秒
file_path = "example.wav"
duration = get_duration_pydub(file_path)
print(f"音頻時(shí)長(zhǎng): {duration} 秒")
優(yōu)點(diǎn)與限制
- 優(yōu)點(diǎn):
- 支持幾乎所有常見(jiàn)格式(MP3、WAV、M4A等)。
- 提供豐富的音頻處理功能(如剪切、合并)。
- 限制:
- 需要安裝
ffmpeg。 - 對(duì)超大文件(>4GB)可能無(wú)法處理。
- 需要安裝
使用librosa庫(kù)
安裝與簡(jiǎn)介
librosa 是專(zhuān)為音樂(lè)和音頻分析設(shè)計(jì)的庫(kù),適合需要高精度分析的場(chǎng)景。
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"音頻時(shí)長(zhǎng): {duration} 秒")
優(yōu)點(diǎn)與限制
- 優(yōu)點(diǎn):
- 高精度分析(適合科研和工程場(chǎng)景)。
- 支持復(fù)雜音頻特征提取。
- 限制:
- 需要加載整個(gè)音頻文件到內(nèi)存。
- 對(duì)非WAV格式需要額外轉(zhuǎn)換。
使用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"音頻時(shí)長(zhǎng): {duration} 秒")
優(yōu)點(diǎn)與限制
- 優(yōu)點(diǎn):
- Python標(biāo)準(zhǔn)庫(kù),無(wú)需額外安裝。
- 限制:
- 僅支持WAV格式。
- 功能單一,擴(kuò)展性差。
使用ffmpeg工具
安裝與簡(jiǎn)介
ffmpeg 是一個(gè)開(kāi)源多媒體處理工具,通過(guò)命令行調(diào)用可獲取音視頻元數(shù)據(jù)。
# 安裝 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"音頻時(shí)長(zhǎng): {duration} 秒")
優(yōu)點(diǎn)與限制
- 優(yōu)點(diǎn):
- 支持幾乎所有音視頻格式。
- 功能全面,適合復(fù)雜處理。
- 限制:
- 依賴(lài)外部工具,需安裝
ffmpeg。 - 調(diào)用方式較復(fù)雜。
- 依賴(lài)外部工具,需安裝
方法對(duì)比與選擇建議
| 方法 | 支持格式 | 依賴(lài)項(xiàng) | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|---|
| mutagen | MP3, FLAC, WAV | 無(wú) | 簡(jiǎn)單易用,支持多格式 | 對(duì)非標(biāo)準(zhǔn)格式支持有限 |
| pydub | 所有常見(jiàn)格式 | ffmpeg | 功能豐富,處理靈活 | 需要安裝外部工具 |
| librosa | WAV, MP3 | 無(wú) | 高精度分析,適合科研場(chǎng)景 | 內(nèi)存占用高 |
| wave | WAV | 無(wú) | 標(biāo)準(zhǔn)庫(kù),無(wú)需額外安裝 | 僅限WAV格式 |
| ffmpeg | 所有音視頻格式 | ffmpeg | 功能全面,支持復(fù)雜處理 | 調(diào)用復(fù)雜,依賴(lài)外部工具 |
實(shí)際應(yīng)用場(chǎng)景
1.批量統(tǒng)計(jì)文件夾內(nèi)音頻總時(shí)長(zhǎng)
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"總時(shí)長(zhǎng): {total / 3600:.2f} 小時(shí)")
2.音頻質(zhì)量檢測(cè)
在語(yǔ)音識(shí)別或音樂(lè)推薦系統(tǒng)中,可能需要過(guò)濾掉時(shí)長(zhǎng)過(guò)短或過(guò)長(zhǎng)的音頻文件。例如:
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.多媒體播放器開(kāi)發(fā)
在開(kāi)發(fā)播放器時(shí),獲取音頻時(shí)長(zhǎng)是進(jìn)度條設(shè)計(jì)的基礎(chǔ)。結(jié)合 pydub 和 GUI 工具包(如 tkinter),可以實(shí)現(xiàn)動(dòng)態(tài)進(jìn)度顯示。
小結(jié)
獲取音頻時(shí)長(zhǎng)是音頻處理中的基礎(chǔ)任務(wù),Python 提供了多種方法滿(mǎn)足不同需求。以下是關(guān)鍵結(jié)論:
- 簡(jiǎn)單快速:使用
mutagen或pydub可快速實(shí)現(xiàn),適合日常需求。 - 高精度分析:
librosa提供科研級(jí)精度,適合需要深度分析的場(chǎng)景。 - 兼容性要求:
ffmpeg是全能工具,支持所有格式,但需安裝外部依賴(lài)。 - 格式限制:
wave模塊僅限WAV文件,適合特定場(chǎng)景。
在實(shí)際開(kāi)發(fā)中,應(yīng)根據(jù)具體需求選擇合適的方法。例如,處理WAV文件時(shí)優(yōu)先使用 wave 模塊;需要兼容多種格式時(shí)選擇 pydub 或 ffmpeg;進(jìn)行科研分析時(shí)使用 librosa。通過(guò)靈活組合這些工具,可以高效完成音頻時(shí)長(zhǎng)的獲取與處理任務(wù)。
到此這篇關(guān)于深入詳解Python如何獲取音視頻時(shí)長(zhǎng)的文章就介紹到這了,更多相關(guān)Python獲取音視頻時(shí)長(zhǎng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)對(duì)數(shù)據(jù)公鑰加密與私鑰解密
這篇文章主要為大家詳細(xì)介紹了如何使用python實(shí)現(xiàn)對(duì)數(shù)據(jù)公鑰加密與私鑰解密,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-06-06
python爬不同圖片分別保存在不同文件夾中的實(shí)現(xiàn)
這篇文章主要介紹了python爬不同圖片分別保存在不同文件夾中的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
python實(shí)現(xiàn)希爾密碼加密的示例代碼
本文主要介紹了python實(shí)現(xiàn)希爾密碼加密,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
python操作攝像頭截圖實(shí)現(xiàn)遠(yuǎn)程監(jiān)控的例子
這篇文章主要介紹了python操作攝像頭截圖實(shí)現(xiàn)遠(yuǎn)程監(jiān)控的例子,例子中包含了控制攝像頭、寫(xiě)入Windows注冊(cè)表方法等,需要的朋友可以參考下2014-03-03
Python利用Rasa框架和SMTPlib庫(kù)實(shí)現(xiàn)郵件回復(fù)助手
在現(xiàn)代辦公場(chǎng)景中,處理大量郵件是一項(xiàng)既耗時(shí)又容易出錯(cuò)的任務(wù),本文將詳細(xì)介紹如何使用Python的Rasa框架和SMTPlib庫(kù)建一個(gè)智能的郵件自動(dòng)回復(fù)助手,感興趣的可以了解下2025-04-04
解決django migrate報(bào)錯(cuò)ORA-02000: missing ALWAYS keyword
這篇文章主要介紹了解決django migrate報(bào)錯(cuò)ORA-02000: missing ALWAYS keyword,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
Python的bit_length函數(shù)來(lái)二進(jìn)制的位數(shù)方法
今天小編就為大家分享一篇Python的bit_length函數(shù)來(lái)二進(jìn)制的位數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
用Python開(kāi)發(fā)app后端有優(yōu)勢(shì)嗎
在本篇文章里小編給大家整理的是關(guān)于app后端開(kāi)發(fā)學(xué)PHP還是Python的先關(guān)問(wèn)題內(nèi)容,需要的朋友們可以參考下。2020-06-06

