最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python調(diào)用FFmpeg處理音視頻文件的幾種方式

 更新時間:2026年07月26日 15:10:33   作者:qq_42215257  
還在為Python調(diào)用FFmpeg時界面卡死、亂碼或超時而頭疼嗎,本文總結(jié)了從基礎(chǔ)subprocess到實時進度獲取、批量處理的最佳實踐,手把手教你避開路徑編碼、文件鎖等常見坑,讓你的音視頻處理腳本更穩(wěn)定高效,需要的朋友可以參考下

做后端開發(fā)的,多少都會遇到需要程序自動處理音視頻文件的場景——給用戶上傳的視頻壓縮一下、從錄屏里提取音頻、或者把一堆圖片合成一個視頻。FFmpeg 是這類任務(wù)的事實標準,但 Python 里怎么調(diào)它效率最高、最穩(wěn)定,我踩了不少坑才總結(jié)出來。

一、最基礎(chǔ)的方式:subprocess.call

最簡單的做法就是直接傳命令字符串:

import subprocess

# 提取音頻
subprocess.call([
    'ffmpeg', '-i', 'input.mp4',
    '-vn', '-c:a', 'mp3', 'output.mp3'
])

call 會阻塞直到命令執(zhí)行完,返回退出碼。好處是簡單,壞處是如果命令耗時很長(比如壓縮一個 2GB 的視頻),程序界面就會卡住。

二、推薦方式:subprocess.run

Python 3.5+ 推薦用 run,它返回一個 CompletedProcess 對象,可以拿到退出碼、標準輸出和標準錯誤:

import subprocess

result = subprocess.run(
    ['ffmpeg', '-i', 'input.mp4', '-vf', 'scale=1280:720', 'output.mp4'],
    capture_output=True,
    text=True,
    timeout=300
)

if result.returncode == 0:
    print('轉(zhuǎn)換成功')
else:
    print('轉(zhuǎn)換失敗:', result.stderr)

這里有一個容易忽略的點:timeout 參數(shù)。不加的話,F(xiàn)Fmpeg 因為某些原因卡住(比如輸入文件損壞),你的 Python 進程也會一直掛著。設(shè)一個合理的超時時間是個好習慣。

三、進階:實時獲取處理進度

FFmpeg 處理大文件時進度信息是輸出到 stderr 的,格式大概這樣:

frame=  120 fps=30.0 time=00:00:04.00 bitrate=128.0kbits/s speed=1.0x

如果你需要實時顯示進度條,可以用 stderr 的管道逐行讀?。?/p>

import subprocess
import re

def convert_with_progress(input_path, output_path):
    cmd = [
        'ffmpeg', '-i', input_path,
        '-c:v', 'libx264', '-preset', 'medium',
        '-progress', 'pipe:1',  # 進度信息輸出到 stdout
        output_path
    ]
    
    process = subprocess.Popen(
        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
        universal_newlines=True, bufsize=1
    )
    
    for line in process.stdout:
        match = re.search(r'out_time_us=(\d+)', line)
        if match:
            us = int(match.group(1))
            seconds = us / 1_000_000
            print(f'已處理: {seconds:.1f} 秒', end='\r')
    
    process.wait()
    if process.returncode == 0:
        print('\n處理完成')
    else:
        error = process.stderr.read()
        print(f'\n處理失敗: {error[:200]}...')

convert_with_progress('large_video.mp4', 'compressed.mp4')

這里用 -progress pipe:1 讓 FFmpeg 把進度信息輸出到 stdout 而不是 stderr,方便 Python 讀取。bufsize=1 確保逐行讀取而不是等緩沖區(qū)滿。

四、批量處理:結(jié)合 Pathlib

處理文件夾下的所有文件時,用 pathlib 搭配 FFmpeg 比 os.path 順手得多:

from pathlib import Path
import subprocess

def batch_convert_to_mp3(input_dir: str, output_dir: str, bitrate='192k'):
    src = Path(input_dir)
    dst = Path(output_dir)
    dst.mkdir(parents=True, exist_ok=True)
    
    files = list(src.glob('*.*'))
    for i, file in enumerate(files, 1):
        if file.suffix.lower() not in ('.mp4', '.mkv', '.mov', '.avi'):
            continue
        
        output = dst / f'{file.stem}.mp3'
        print(f'[{i}/{len(files)}] {file.name}')
        
        subprocess.run([
            'ffmpeg', '-y', '-i', str(file),
            '-vn', '-c:a', 'libmp3lame',
            '-b:a', bitrate,
            str(output)
        ], capture_output=True)

batch_convert_to_mp3('./videos', './audios')

-y 參數(shù)自動覆蓋已有文件,避免交互式確認導(dǎo)致腳本卡住。這在批量處理時幾乎必加。

五、幾個常見的錯誤及處理

1. FFmpeg 不在 PATH 里

Windows 上最容易遇到。建議在腳本開頭檢查:

import shutil

ffmpeg_path = shutil.which('ffmpeg')
if not ffmpeg_path:
    raise RuntimeError('未找到 FFmpeg,請確認已安裝并加入系統(tǒng) PATH')

2. 輸入文件被占用

Windows 上如果文件正在被其他程序使用(比如你剛用播放器打開了它),F(xiàn)Fmpeg 會報 Permission denied。建議操作前先嘗試用只讀模式打開文件確認沒被鎖:

def is_file_locked(filepath):
    try:
        with open(filepath, 'rb') as f:
            return False
    except PermissionError:
        return True

3. 中文字符路徑

Windows 下路徑包含中文時,建議用 Path 對象的 resolve() 獲取絕對路徑傳給 FFmpeg,避免編碼問題。

4. 進度信息解析失敗

不同版本的 FFmpeg 輸出的進度格式可能有細微差異。建議做兩層匹配,先試新版格式再試舊版:

match = re.search(r'out_time_us=(\d+)', line)
if not match:
    match = re.search(r'time=(\d+):(\d+):(\d+)\.(\d+)', line)

總結(jié)

Python 調(diào) FFmpeg 的核心模式就三個:subprocess.run 跑一次性任務(wù)、Popen 讀進度、配合 pathlib 做批量。大部分坑都出在路徑編碼、超時處理、文件鎖這三個地方,寫腳本時注意繞開就行。

以上就是Python調(diào)用FFmpeg處理音視頻文件的幾種方式的詳細內(nèi)容,更多關(guān)于Python FFmpeg處理音視頻文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python自動掃描出微信不是好友名單的方法

    Python自動掃描出微信不是好友名單的方法

    很多人想要清楚已經(jīng)被刪除的好友名單。面對龐大的好友數(shù)量想要清除談何容易,本文主要介紹了Python自動掃描出微信不是好友名單的方法,感興趣的可以了解一下
    2021-05-05
  • 對python中的os.getpid()和os.fork()函數(shù)詳解

    對python中的os.getpid()和os.fork()函數(shù)詳解

    今天小編就為大家分享一篇對python中的os.getpid()和os.fork()函數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python中playwright啟動瀏覽器與常見運行方式詳解

    Python中playwright啟動瀏覽器與常見運行方式詳解

    Playwright是一個功能強大的工具,可以幫助開發(fā)人員自動化測試、網(wǎng)頁截圖、信息提取等任務(wù),本文主要介紹了如何使用Playwright來啟動瀏覽器,感興趣的可以了解下
    2024-05-05
  • python中使用xlrd、xlwt操作excel表格詳解

    python中使用xlrd、xlwt操作excel表格詳解

    這篇文章主要介紹了python中使用xlrd、xlwt操作excel表格詳解,python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫,需要的朋友可以參考下
    2015-01-01
  • Qt通過QGraphicsview實現(xiàn)簡單縮放及還原效果

    Qt通過QGraphicsview實現(xiàn)簡單縮放及還原效果

    本文主要介紹通過QGraphicsview實現(xiàn)簡單的縮放以及縮放后還原原始大小,通過scale可以對view進行放大或縮小,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-09-09
  • Python K-means實現(xiàn)簡單圖像聚類的示例代碼

    Python K-means實現(xiàn)簡單圖像聚類的示例代碼

    本文主要介紹了Python K-means實現(xiàn)簡單圖像聚類的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Python的Random庫的使用方法詳解

    Python的Random庫的使用方法詳解

    這篇文章主要介紹了Python的Random庫的使用方法詳解,random庫是使用隨機數(shù)的Python標準庫,python中用于生成偽隨機數(shù)的函數(shù)庫是random,需要的朋友可以參考下
    2023-07-07
  • python使用DebugInfo模塊打印一個條形堆積圖

    python使用DebugInfo模塊打印一個條形堆積圖

    今天介紹一個不使用 matplot,通過 DebugInfo模塊打印條形堆積圖的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-08-08
  • Python selenium文件上傳下載功能代碼實例

    Python selenium文件上傳下載功能代碼實例

    這篇文章主要介紹了Python selenium文件上傳下載功能代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Flask框架請求鉤子與request請求對象用法實例分析

    Flask框架請求鉤子與request請求對象用法實例分析

    這篇文章主要介紹了Flask框架請求鉤子與request請求對象用法,結(jié)合實例形式詳細分析了Flask框架請求鉤子與request請求對象相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下
    2019-11-11

最新評論

北票市| 绍兴县| 井陉县| 抚顺市| 华池县| 汶川县| 黑河市| 三江| 北流市| 元阳县| 公安县| 乐东| 武夷山市| 汪清县| 佛坪县| 汶川县| 闻喜县| 永川市| 屯门区| 武川县| 巨野县| 东明县| 新兴县| 托克逊县| 中江县| 高雄县| 鄂尔多斯市| 西和县| 大城县| 平遥县| 侯马市| 萝北县| 土默特左旗| 瑞金市| 阜宁县| 乌兰察布市| 文登市| 尚志市| 邯郸县| 吴忠市| 普安县|