深入詳解Python如何獲取音視頻時長
Python獲取音視頻時長
1、安裝插件
pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple
2、獲取音視頻時長.py
上代碼:獲取音視頻時長.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)建文件,存在的話就追加寫入
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("請輸入文件擴(kuò)展名,例如:'.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("程序執(zhí)行完畢,請按任意鍵退出...")
打包exe
pyinstaller -F 獲取音視頻時長.py
Python獲取音頻時長:從基礎(chǔ)到高級方法
在音頻處理和數(shù)據(jù)分析中,獲取音頻文件的時長是一項基礎(chǔ)但關(guān)鍵的任務(wù)。無論是統(tǒng)計音樂庫的總播放時間、分析語音數(shù)據(jù),還是開發(fā)多媒體應(yīng)用,都需要精確獲取音頻時長。Python作為一門功能強(qiáng)大的編程語言,提供了多種庫和工具來實現(xiàn)這一目標(biāo)。本文將詳細(xì)介紹如何使用Python獲取音頻時長的常見方法,并通過代碼示例和對比分析幫助讀者選擇最適合的方案。
音頻時長的定義與獲取原理
音頻時長的基本概念
音頻時長是指音頻文件從開始到結(jié)束的播放時間,通常以秒(s)為單位。其計算方式取決于音頻文件的編碼格式和元數(shù)據(jù)存儲方式。例如:
- WAV文件:通過采樣率和幀數(shù)計算(
時長 = 幀數(shù) / 采樣率)。 - MP3文件:通過ID3標(biāo)簽或比特率計算。
- M4A文件:依賴容器格式的元數(shù)據(jù)。
獲取時長的核心方法
獲取音頻時長的核心思路是讀取文件的元數(shù)據(jù)或解析音頻流。常見的實現(xiàn)方式包括:
- 讀取元數(shù)據(jù):通過ID3標(biāo)簽、FFmpeg等工具直接提取時長信息。
- 解析音頻流:通過采樣率、比特率等參數(shù)計算時長。
- 第三方庫封裝:利用現(xiàn)成的Python庫簡化操作。
常用方法及代碼實現(xiàn)
使用mutagen庫
安裝與簡介
mutagen 是一個用于處理音頻元數(shù)據(jù)的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} 秒")
優(yōu)點與限制
- 優(yōu)點:
- 支持多種音頻格式。
- 無需安裝外部工具。
- 限制:
- 對非標(biāo)準(zhǔn)格式的支持可能有限。
使用pydub庫
安裝與簡介
pydub 是一個強(qiáng)大的音頻處理庫,依賴 ffmpeg 或 libav 工具。它通過加載音頻文件并計算總幀數(shù)來獲取時長。
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"音頻時長: {duration} 秒")
優(yōu)點與限制
- 優(yōu)點:
- 支持幾乎所有常見格式(MP3、WAV、M4A等)。
- 提供豐富的音頻處理功能(如剪切、合并)。
- 限制:
- 需要安裝
ffmpeg。 - 對超大文件(>4GB)可能無法處理。
- 需要安裝
使用librosa庫
安裝與簡介
librosa 是專為音樂和音頻分析設(shè)計的庫,適合需要高精度分析的場景。
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} 秒")
優(yōu)點與限制
- 優(yōu)點:
- 高精度分析(適合科研和工程場景)。
- 支持復(fù)雜音頻特征提取。
- 限制:
- 需要加載整個音頻文件到內(nèi)存。
- 對非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"音頻時長: {duration} 秒")
優(yōu)點與限制
- 優(yōu)點:
- Python標(biāo)準(zhǔn)庫,無需額外安裝。
- 限制:
- 僅支持WAV格式。
- 功能單一,擴(kuò)展性差。
使用ffmpeg工具
安裝與簡介
ffmpeg 是一個開源多媒體處理工具,通過命令行調(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"音頻時長: {duration} 秒")
優(yōu)點與限制
- 優(yōu)點:
- 支持幾乎所有音視頻格式。
- 功能全面,適合復(fù)雜處理。
- 限制:
- 依賴外部工具,需安裝
ffmpeg。 - 調(diào)用方式較復(fù)雜。
- 依賴外部工具,需安裝
方法對比與選擇建議
| 方法 | 支持格式 | 依賴項 | 優(yōu)點 | 缺點 |
|---|---|---|---|---|
| mutagen | MP3, FLAC, WAV | 無 | 簡單易用,支持多格式 | 對非標(biāo)準(zhǔn)格式支持有限 |
| pydub | 所有常見格式 | ffmpeg | 功能豐富,處理靈活 | 需要安裝外部工具 |
| librosa | WAV, MP3 | 無 | 高精度分析,適合科研場景 | 內(nèi)存占用高 |
| wave | WAV | 無 | 標(biāo)準(zhǔn)庫,無需額外安裝 | 僅限WAV格式 |
| ffmpeg | 所有音視頻格式 | ffmpeg | 功能全面,支持復(fù)雜處理 | 調(diào)用復(fù)雜,依賴外部工具 |
實際應(yīng)用場景
1.批量統(tǒng)計文件夾內(nèi)音頻總時長
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.音頻質(zhì)量檢測
在語音識別或音樂推薦系統(tǒ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.多媒體播放器開發(fā)
在開發(fā)播放器時,獲取音頻時長是進(jìn)度條設(shè)計的基礎(chǔ)。結(jié)合 pydub 和 GUI 工具包(如 tkinter),可以實現(xiàn)動態(tài)進(jìn)度顯示。
小結(jié)
獲取音頻時長是音頻處理中的基礎(chǔ)任務(wù),Python 提供了多種方法滿足不同需求。以下是關(guān)鍵結(jié)論:
- 簡單快速:使用
mutagen或pydub可快速實現(xiàn),適合日常需求。 - 高精度分析:
librosa提供科研級精度,適合需要深度分析的場景。 - 兼容性要求:
ffmpeg是全能工具,支持所有格式,但需安裝外部依賴。 - 格式限制:
wave模塊僅限WAV文件,適合特定場景。
在實際開發(fā)中,應(yīng)根據(jù)具體需求選擇合適的方法。例如,處理WAV文件時優(yōu)先使用 wave 模塊;需要兼容多種格式時選擇 pydub 或 ffmpeg;進(jìn)行科研分析時使用 librosa。通過靈活組合這些工具,可以高效完成音頻時長的獲取與處理任務(wù)。
到此這篇關(guān)于深入詳解Python如何獲取音視頻時長的文章就介紹到這了,更多相關(guān)Python獲取音視頻時長內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用pymysql模塊操作mysql增刪改查實例分析
這篇文章主要介紹了Python使用pymsql模塊操作mysql增刪改查,結(jié)合實例形式分析了Python使用pymsql模塊針對mysql進(jìn)行增刪改查操作的相關(guān)實現(xiàn)方法與操作注意事項,需要的朋友可以參考下2019-12-12
基于Python實現(xiàn)視頻轉(zhuǎn)字符畫動漫小工具
大家都知道視頻就是一幀一幀的圖片構(gòu)成的。那么想要實現(xiàn)將視頻轉(zhuǎn)換為字符畫,就要將一部視頻全部逐幀拆解成圖片,然后采取和以前相同的將圖片轉(zhuǎn)換為字符畫的算法即可。本文將詳細(xì)為大家介紹如何實現(xiàn),需要的可以參考一下2021-12-12
python concurrent.futures模塊的使用測試
大家都知道concurrent.futures 是 3.2 中引入的新模塊,它為異步執(zhí)行可調(diào)用對象提供了高層接口,今天通過本文給大家介紹python concurrent.futures模塊的使用測試 ,感興趣的朋友一起看看吧2021-07-07
VSCode設(shè)置Python語言自動格式化的詳細(xì)方案
VSCode Python自動格式化是指使用VSCode編輯器中的Python插件,可以自動對Python代碼進(jìn)行格式化,使其符合PEP 8規(guī)范,這篇文章主要給大家介紹了關(guān)于VSCode設(shè)置Python語言自動格式化的詳細(xì)方案,需要的朋友可以參考下2023-07-07
Python入門教程(十一)Python中的運(yùn)算符
這篇文章主要介紹了Python入門教程(十一)Python中的運(yùn)算符,Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下2023-04-04
Python 身份驗證和授權(quán)庫使用詳解(python jwt庫)
python_jwt是一個Python庫,用于生成、解析和驗證JSON Web Tokens(JWT),它完全符合JWT標(biāo)準(zhǔn)規(guī)范(RFC 7519),并提供了簡單而強(qiáng)大的API,使得用戶可以輕松地在Python應(yīng)用中實現(xiàn)JWT功能,通過本文的介紹,深入探討了python_jwt庫的功能特性、使用方法以及應(yīng)用場景2021-01-01

