FFMPeg在Python中的使用

FFMPeg是一个开元的音视频处理工具集。一般作为命令行工具进行使用(ffmpeg转码工具、ffprobe媒体分析工具、ffplay播放器)。

主要功能:格式转换、编码/解码、流处理、编辑处理(剪辑/合并/过滤)、元数据、设备采集(摄像头、麦克风捕获)、质量分析(音视频质量检测)

可以看下 ffmpeg官网

一、直接通过命令使用(subprocess调用)

FFMPeg本身是一个命令行工具,通过subprocess模块实现ffmpeg的命令,从而完成在python中对ffmpeg工具的调用。

python 复制代码
import subprocess
import os

# 基本格式转换
def convert_video(input_path, output_path):
    cmd = [
        'ffmpeg',
        '-i', input_path,          # 输入文件
        '-c:v', 'libx264',         # 视频编码器
        '-c:a', 'aac',            # 音频编码器
        output_path
    ]
    subprocess.run(cmd)

# 调整视频分辨率
def resize_video(input_path, output_path, width, height):
    cmd = [
        'ffmpeg',
        '-i', input_path,
        '-vf', f'scale={width}:{height}',  # 调整分辨率
        '-c:a', 'copy',                    # 音频直接复制
        output_path
    ]
    subprocess.run(cmd)

# 提取视频中的音频
def extract_audio(input_path, output_path):
    cmd = [
        'ffmpeg',
        '-i', input_path,
        '-vn',                     # 忽略视频
        '-acodec', 'mp3',         # 音频编码
        output_path
    ]
    subprocess.run(cmd)

# 获取视频信息
def get_video_info(input_path):
    cmd = [
        'ffprobe',
        '-v', 'error',
        '-show_format',
        '-show_streams',
        input_path
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    return result.stdout

二、使用ffmpeg的相关库

ffmpeg-python库和moviepy库都是依赖ffmpeg构建的两个库:ffmpeg-python是对FFmpeg命令的python接口,MoviePy 内部调用 FFmpeg。

特性 FFmpeg-Python MoviePy
适用场景 FFmpeg命令行替代,复杂滤镜 高级视频编辑,特效制作
学习曲线 中等(需了解FFmpeg) 较低(Pythonic API)
性能 高(直接调用FFmpeg) 中等(Python层处理)
实时预览 不支持 支持(Jupyter)
自定义程度 高(所有FFmpeg功能) 中等(封装好的功能)
内存使用 低(流式处理) 高(常加载全文件)
选择建议 需要精确控制FFmpeg参数 处理流媒体或直播 需要复杂滤镜链 追求最高性能 需要快速原型开发 进行复杂的时间线编辑 需要实时预览效果 结合NumPy/OpenCV进行图像处理 在Jupyter中进行交互式编辑

1、使用ffmpeg-python库进行调用

通过 pip install ffmpeg-python 命令下载该库。FFmpeg-Python 是一个 FFmpeg 命令的Python包装器,它提供链式调用语法、类型安全机制。能够直接对应ffmpeg的命令。

其核心流程是:input输入 -> filter处理 -> output输出.-> run执行。

python 复制代码
# 1. 视频滤镜链
(
    ffmpeg
    .input('input.mp4')
    .filter('scale', width=1280, height=720)      # 调整大小
    .filter('fps', fps=30, round='up')           # 调整帧率
    .filter('crop', w=640, h=480, x=100, y=100)  # 裁剪
    .filter('hflip')                              # 水平翻转
    .filter('vflip')                              # 垂直翻转
    .filter('rotate', angle=45*PI/180)           # 旋转
    .filter('unsharp', luma_msize_x=5, luma_amount=1.0)  # 锐化
    .filter('eq', brightness=0.1, contrast=1.1)   # 亮度对比度
    .output('output.mp4')
    .run()
)

# 2. 复杂滤镜图(多个流处理)
split_stream = ffmpeg.input('input.mp4').filter_multi_output('split')
stream1 = split_stream[0].filter('hflip')
stream2 = split_stream[1].filter('vflip')
# 并排显示
overlay_stream = ffmpeg.filter([stream1, stream2], 'hstack')

# 3. 画中画效果
main_video = ffmpeg.input('main.mp4')
pip_video = ffmpeg.input('pip.mp4').filter('scale', 320, 180)

(
    ffmpeg
    .filter([main_video, pip_video], 'overlay', 
            x='main_w-overlay_w-10',  # 右上角
            y=10)
    .output('output.mp4')
    .run()
)

# 音频滤镜链
(
    ffmpeg
    .input('audio.wav')
    .filter('volume', volume=1.5)           # 音量调整
    .filter('afade', type='in', duration=2) # 淡入
    .filter('afade', type='out', start_time=58, duration=2) # 淡出
    .filter('highpass', frequency=100)      # 高通滤波
    .filter('lowpass', frequency=3000)      # 低通滤波
    .filter('equalizer', f=1000, width_type='h', width=100, gain=10)  # EQ
    .filter('atempo', tempo=1.5)            # 变速不变调
    .filter('aecho', in_gain=0.8, out_gain=0.9, 
            delays=60, decays=0.4)          # 回声
    .output('processed_audio.wav')
    .run()
)

2、使用MoviePy库进行编辑

通过 pip install moviepy 命令下载库,该库面向对象设计,支持Numpy数据直接操作。其核心对象模型有

  • VideoFileClip("video.mp4") 视频剪辑对象
  • AudioFileClip("audio.mp3")音频剪辑对象
  • TextClip("Hello")文字剪辑对象
  • ImageClip ("image.png ") 图片剪辑对象
  • CompositeVideoClip([clip, text.set_position('center')])组合剪辑对象
python 复制代码
from moviepy.editor import *
import numpy as np

# 1. 视频加载和基础操作
clip = VideoFileClip("input.mp4")

# 基础属性
print(f"时长: {clip.duration}秒")
print(f"大小: {clip.size}")
print(f"帧率: {clip.fps}")

# 时间线操作
clip_sub = clip.subclip(10, 20)                # 截取10-20秒
clip_speed = clip.speedx(2)                    # 2倍速
clip_reverse = clip.fx(vfx.time_mirror)        # 倒放
clip_loop = clip.loop(duration=30)             # 循环到30秒
# 视觉效果
clip_bw = clip.fx(vfx.blackwhite)              # 黑白
clip_invert = clip.fx(vfx.invert_colors)       # 反色
clip_fadein = clip.fx(vfx.fadein, duration=2)  # 淡入
clip_fadeout = clip.fx(vfx.fadeout, duration=2)# 淡出
# 变换效果
clip_rotated = clip.fx(vfx.rotate, angle=30)   # 旋转
clip_scroll = clip.fx(vfx.scroll, h=100, w=50) # 滚动
clip_mirror_x = clip.fx(vfx.mirror_x)          # X轴镜像
clip_mirror_y = clip.fx(vfx.mirror_y)          # Y轴镜像

# 2. 复杂时间线编辑
clip1 = VideoFileClip("video1.mp4").subclip(0, 5)
clip2 = VideoFileClip("video2.mp4").subclip(0, 5)
clip3 = VideoFileClip("video3.mp4").subclip(0, 5)

# 拼接方式1
concatenated = concatenate_videoclips([clip1, clip2, clip3], 
                                      method="compose")  # 自动调整尺寸
# 拼接方式2
concatenated = clip1.concat(clip2).concat(clip3)

# 3. 图层合成(类似Photoshop)
background = VideoFileClip("bg.mp4")
foreground1 = VideoFileClip("fg1.mp4").set_position(('center', 'top'))
foreground2 = ImageClip("logo.png").set_duration(10).set_position(('right', 'bottom'))

composite = CompositeVideoClip([
    background,
    foreground1,
    foreground2
], size=background.size)
相关推荐
封奚泽优18 小时前
下载网页中的.m3u8视频文件
ffmpeg
Vertira21 小时前
win10/10 下载并安装ffmpeg.exe 的官方详细方法 (已解决)
ffmpeg
xmRao1 天前
Qt+FFmpeg 实现音频重采样
qt·ffmpeg·音视频
Evonso2 天前
静态编译的ffmpeg用法
ffmpeg
_chirs4 天前
编译不依赖动态库的FFMPEG(麒麟国防 V10)
arm开发·ffmpeg
熊猫钓鱼>_>4 天前
从零到一:打造“抗造” Electron 录屏神器的故事
前端·javascript·ffmpeg·electron·node·录屏·record
UpYoung!4 天前
【格式转换工具】专业级多媒体格式转换解决方案——Freemake Video Converter 完全指南:轻量化视频剪辑媒体格式转换
ffmpeg·短视频·实用工具·开源工具·多媒体格式转换·运维必备·视频转换格式
试剂小课堂 Pro5 天前
Ald-PEG-Ald:丙醛与聚乙二醇两端连接的对称分子
java·c语言·c++·python·ffmpeg
MaoSource5 天前
Debian 12 安装 FFmpeg 命令
服务器·ffmpeg·debian
白云千载尽6 天前
交换空间扩容与删除、hugginface更换默认目录、ffmpeg视频处理、清理空间
python·ffmpeg·控制·mpc·navsim