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

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

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

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

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

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

import subprocess

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

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

二、推薦方式:subprocess.run

Python 3.5+ 推薦用 run,它返回一個(gè) CompletedProcess 對(duì)象,可以拿到退出碼、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤:

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)

這里有一個(gè)容易忽略的點(diǎn):timeout 參數(shù)。不加的話,F(xiàn)Fmpeg 因?yàn)槟承┰蚩ㄗ。ū热巛斎胛募p壞),你的 Python 進(jìn)程也會(huì)一直掛著。設(shè)一個(gè)合理的超時(shí)時(shí)間是個(gè)好習(xí)慣。

三、進(jìn)階:實(shí)時(shí)獲取處理進(jìn)度

FFmpeg 處理大文件時(shí)進(jìn)度信息是輸出到 stderr 的,格式大概這樣:

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

如果你需要實(shí)時(shí)顯示進(jìn)度條,可以用 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',  # 進(jìn)度信息輸出到 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 把進(jìn)度信息輸出到 stdout 而不是 stderr,方便 Python 讀取。bufsize=1 確保逐行讀取而不是等緩沖區(qū)滿。

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

處理文件夾下的所有文件時(shí),用 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òng)覆蓋已有文件,避免交互式確認(rèn)導(dǎo)致腳本卡住。這在批量處理時(shí)幾乎必加。

五、幾個(gè)常見的錯(cuò)誤及處理

1. FFmpeg 不在 PATH 里

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

import shutil

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

2. 輸入文件被占用

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

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

3. 中文字符路徑

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

4. 進(jìn)度信息解析失敗

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

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 的核心模式就三個(gè):subprocess.run 跑一次性任務(wù)、Popen 讀進(jìn)度、配合 pathlib 做批量。大部分坑都出在路徑編碼、超時(shí)處理、文件鎖這三個(gè)地方,寫腳本時(shí)注意繞開就行。

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

相關(guān)文章

  • Python自動(dòng)掃描出微信不是好友名單的方法

    Python自動(dòng)掃描出微信不是好友名單的方法

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

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

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

    Python中playwright啟動(dòng)瀏覽器與常見運(yùn)行方式詳解

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

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

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

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

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

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

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

    Python的Random庫的使用方法詳解

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

    python使用DebugInfo模塊打印一個(gè)條形堆積圖

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

    Python selenium文件上傳下載功能代碼實(shí)例

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

    Flask框架請(qǐng)求鉤子與request請(qǐng)求對(duì)象用法實(shí)例分析

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

最新評(píng)論

平舆县| 成武县| 江油市| 涿鹿县| 马龙县| 广灵县| 永和县| 南开区| 勐海县| 色达县| 中牟县| 壶关县| 泊头市| 册亨县| 临澧县| 绥宁县| 青岛市| 抚顺县| 师宗县| 怀来县| 交城县| 渝北区| 汝州市| 盈江县| 巴彦县| 抚顺市| 大悟县| 枣强县| 高台县| 六枝特区| 通城县| 武宁县| 霍州市| 大埔县| 云梦县| 石阡县| 金门县| 阿合奇县| 怀集县| 河间市| 杭锦旗|