【python】Python如何通过FFmpeg处理音视频

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • FFmpeg
    • 安装FFmpeg和ffmpeg-python
      • 安装FFmpeg
      • 安装ffmpeg-python
    • ffmpeg-python基础
      • 导入库
      • 基本操作
      • 示例:转换视频格式
    • 实际案例
      • 案例一:裁剪视频
      • 案例二:提取音频
      • 案例三:给视频添加水印
      • 案例四:合并音视频
      • 案例五:调整视频帧率
      • 案例六:视频转码
      • 案例七:视频截图
      • 案例八:视频拼接
    • 高级用法
      • 调整视频播放速度
      • 拼接视频片段
      • 添加背景音乐
      • 添加字幕
      • 使用FFmpeg的过滤器
      • 调用FFmpeg命令行
    • 总结

FFmpeg

FFmpeg是一个功能强大的开源多媒体处理工具,能够处理几乎所有类型的音频和视频文件。在Python中,通过ffmpeg-python库,我们可以轻松地在Python脚本中调用FFmpeg的功能,实现音视频文件的处理、转换、编辑等任务。本教程将详细介绍如何在Python中使用ffmpeg-python库,并通过实际案例展示其用法。

安装FFmpeg和ffmpeg-python

安装FFmpeg

首先,你需要在你的机器上安装FFmpeg。FFmpeg的安装方式取决于你的操作系统。对于大多数Linux发行版,你可以通过包管理器安装FFmpeg。例如,在Ubuntu上,你可以使用以下命令:

sudo apt update
sudo apt install ffmpeg

对于Windows和macOS,你可以从FFmpeg的官方网站下载预编译的二进制文件,并按照说明进行安装。

安装ffmpeg-python

安装完FFmpeg后,你需要在Python环境中安装ffmpeg-python库。这可以通过pip轻松完成:

pip install ffmpeg-python

ffmpeg-python基础

导入库

在Python脚本中,首先需要导入ffmpeg模块:

import ffmpeg

基本操作

ffmpeg-python库提供了几个核心函数,用于构建和处理音视频流:

  • ffmpeg.input(): 指定输入文件或视频流。
  • ffmpeg.output(): 指定输出文件或视频流。
  • ffmpeg.run(): 运行FFmpeg命令行工具进行转码或处理。

示例:转换视频格式

以下是一个简单的示例,展示了如何使用ffmpeg-python将一个视频文件从MP4格式转换为AVI格式:

input_file = 'input.mp4'
output_file = 'output.avi'# 创建输入和输出流
input_stream = ffmpeg.input(input_file)
output_stream = ffmpeg.output(input_stream, output_file)# 运行FFmpeg命令
ffmpeg.run(output_stream)

实际案例

案例一:裁剪视频

假设你需要裁剪视频文件中的某个片段。使用ffmpeg-python,你可以轻松实现这一功能。以下是一个裁剪视频前10秒的示例:

input_file = 'input.mp4'
output_file = 'output_cropped.mp4'# 使用trim过滤器裁剪视频
# 注意:trim过滤器在ffmpeg-python中可能不直接支持,但可以通过filter_complex实现
start_time = 0  # 起始时间(秒)
duration = 10   # 持续时间(秒)# 创建输入和输出流,并使用filter_complex添加裁剪参数
input_stream = ffmpeg.input(input_file)
output_stream = ffmpeg.output(input_stream, output_file,filter_complex=f"trim=start={start_time}:duration={duration}")# 运行FFmpeg命令
ffmpeg.run(output_stream)

案例二:提取音频

从视频文件中提取音频是另一个常见的需求。使用ffmpeg-python,你可以轻松实现:

input_file = 'input.mp4'
output_file = 'output_audio.wav'# 创建输入和输出流,指定只提取音频流
input_stream = ffmpeg.input(input_file)
audio_stream = input_stream['a']  # 提取音频流
output_stream = ffmpeg.output(audio_stream, output_file)# 运行FFmpeg命令
ffmpeg.run(output_stream)

案例三:给视频添加水印

给视频添加水印是视频编辑中的一个常见任务。使用ffmpeg-python,你可以通过overlay过滤器实现:

input_file = 'input.mp4'
watermark_file = 'watermark.png'
output_file = 'output_with_watermark.mp4'# 创建输入流(视频和水印)
input_stream = ffmpeg.input(input_file)
watermark_stream = ffmpeg.input(watermark_file)# 使用filter_complex添加水印
# 假设水印位于视频右下角,距离边缘10像素
output_stream = ffmpeg.output(input_stream, watermark_stream, output_file,filter_complex=f"overlay=main_w-overlay_w-10:main_h-overlay_h-10")# 运行FFmpeg命令
ffmpeg.run(output_stream)

案例四:合并音视频

有时,你可能需要将音频和视频文件合并成一个文件。使用ffmpeg-python,这也是一个简单的过程:

input_audio = 'input_audio.wav'
input_video = 'input_video.mp4'
output_file = 'output_merged.mp4'# 创建输入流(音频和视频)
audio_stream = ffmpeg.input(input_audio)
video_stream = ffmpeg.input(input_video)# 合并音视频流
output_stream = ffmpeg.output(audio_stream, video_stream, output_file)# 运行FFmpeg命令
ffmpeg.run(output_stream)

案例五:调整视频帧率

有时,你可能需要调整视频的帧率以适应特定的播放要求或节省存储空间。在ffmpeg-python中,你可以通过fps过滤器来实现这一点。

import ffmpeginput_file = 'input.mp4'
output_file = 'output_framerate_adjusted.mp4'# 假设我们将帧率调整为每秒24帧
target_fps = 24# 创建输入和输出流,并使用fps过滤器
input_stream = ffmpeg.input(input_file)
output_stream = ffmpeg.output(input_stream, output_file, filter='fps=fps='+str(target_fps))# 运行FFmpeg命令
ffmpeg.run(output_stream)

案例六:视频转码

视频转码是将视频从一个编码格式转换为另一个编码格式的过程。这通常用于优化视频文件的大小、兼容性或质量。

import ffmpeginput_file = 'input.avi'
output_file = 'output_transcoded.mp4'# 创建输入和输出流,指定输出编码格式为libx264
input_stream = ffmpeg.input(input_file)
output_stream = ffmpeg.output(input_stream, output_file, vcodec='libx264', crf=23)# CRF(Constant Rate Factor)是一个用于控制视频质量的参数,值越小质量越高,但文件也越大# 运行FFmpeg命令
ffmpeg.run(output_stream)

案例七:视频截图

从视频中截取特定帧作为图片是一个常见的需求。使用ffmpeg-python,你可以很容易地实现这一点。

import ffmpeginput_file = 'input.mp4'
output_image = 'output_frame.png'# 假设我们要截取视频的第10秒(即第240帧,假设帧率为24fps)
frame_number = 240# 创建输入和输出流,并使用select和scale过滤器(如果需要调整图片大小)
input_stream = ffmpeg.input(input_file, ss=frame_number, vframes=1)
output_stream = ffmpeg.output(input_stream, output_image)# 运行FFmpeg命令
ffmpeg.run(output_stream)# 注意:ss参数用于指定起始时间(秒),vframes=1表示只截取一帧

案例八:视频拼接

将多个视频文件拼接成一个单独的视频文件是视频编辑中的一个常见任务。在ffmpeg-python中,你可以通过concat协议或concat过滤器来实现这一点。

使用concat协议(适用于文件列表已知且较小的情况):

import ffmpeg# 视频文件列表
files = ['video1.mp4', 'video2.mp4', 'video3.mp4']
output_file = 'output_concatenated.mp4'# 创建一个文本文件(例如filelist.txt),每行包含一个文件路径
# file 'video1.mp4'
# file 'video2.mp4'
# file 'video3.mp4'# 或者直接在命令行中构建ffmpeg命令(这里为了示例清晰,不直接展示)# 注意:由于ffmpeg-python直接API的限制,使用concat协议时可能需要手动创建文件列表或使用subprocess
# 这里我们假设文件列表已经准备好# 使用subprocess作为替代方案(非ffmpeg-python直接方法)
# command = f"ffmpeg -f concat -safe 0 -i filelist.txt -c copy {output_file}"
# subprocess.run(command, shell=True)# 注意:上述subprocess代码仅作为概念演示,实际使用时请确保安全性

由于ffmpeg-python库本身不直接支持concat协议的文件列表方法,因此在处理大量文件或需要动态构建文件列表时,可能需要结合使用Python的文件操作功能和subprocess模块。

然而,对于简单的拼接任务,你可以考虑使用concat过滤器,但这通常要求所有输入视频具有相同的编解码器、分辨率和帧率等属性。

高级用法

调整视频播放速度

调整视频播放速度可以通过filter()方法应用setpts滤镜来实现:

input_video = 'input.mp4'
output_video = 'output_speeded_up.mp4'# 调整视频播放速度为原来的2倍
ffmpeg.input(input_video).filter('setpts', '0.5*PTS').output(output_video).run()

注意,setpts滤镜的参数'0.5*PTS'意味着将视频帧的显示时间减半,即视频播放速度变为原来的2倍。

假设你正在制作一个视频教程,你需要将多个视频片段拼接起来,并添加背景音乐和字幕。下面是一个使用ffmpeg-python完成这个任务的例子:

拼接视频片段

首先,你需要将多个视频片段拼接成一个完整的视频。这可以通过concat()方法实现,但更常用的是通过concat滤镜:

video_files = ['part1.mp4', 'part2.mp4', 'part3.mp4']
output_video = 'final_video.mp4'# 拼接视频片段
concat_filter = ffmpeg.concat(video_files, v=1, a=1)
ffmpeg.input(concat_filter).output(output_video).run()

注意,concat()方法在这里并未直接使用,因为ffmpeg-python的concat函数主要用于构建拼接视频的滤镜字符串。在这个例子中,我们直接通过ffmpeg.concat()函数生成了一个拼接滤镜字符串,并通过input()方法将其作为输入流。

添加背景音乐

接下来,你需要将背景音乐添加到拼接好的视频中。这可以通过audio.addinput()方法实现:

background_music = 'background.mp3'# 加载视频和音频文件
video_stream = ffmpeg.input(output_video)
audio_stream = ffmpeg.input(background_music)# 将音频添加到视频中
ffmpeg.input(video_stream).audio.addinput(audio_stream).output(output_video + '_with_music.mp4').run()

注意,由于我们已经有了output_video这个视频文件,所以这里将输出文件命名为output_video + '_with_music.mp4'以避免覆盖原文件。

添加字幕

最后,你可能需要给视频添加字幕。这可以通过add_subtitle()方法实现,但更常用的是通过filter_complex参数和subtitles滤镜:

subtitle_file = 'subtitles.srt'# 添加字幕
output_stream = ffmpeg.output(ffmpeg.input(output_video + '_with_music.mp4'),None,  # 忽略视频输出,因为我们只是添加字幕output_video + '_with_subtitles.mp4',filter_complex=f'subtitles={subtitle_file}:force_style="FontName=Arial,FontSize=24,PrimaryColour=&H00FFFFFF&"'
)
ffmpeg.run(output_stream)

注意,在这个例子中,我们使用了filter_complex参数和subtitles滤镜来添加字幕。force_style参数用于指定字幕的样式,包括字体名称、大小和颜色等。

使用FFmpeg的过滤器

FFmpeg提供了大量的过滤器,用于实现复杂的音视频处理任务。在ffmpeg-python中,你可以通过filter_complex参数来使用这些过滤器。例如,你可以使用scale过滤器来调整视频的大小:

input_file = 'input.mp4'
output_file = 'output_scaled.mp4'# 假设我们将视频大小调整为640x480
width = 640
height = 480# 创建输入和输出流,并使用scale过滤器
input_stream = ffmpeg.input(input_file)
output_stream = ffmpeg.output(input_stream, output_file,filter_complex=f"scale={width}:{height}")# 运行FFmpeg命令
ffmpeg.run(output_stream)

调用FFmpeg命令行

虽然ffmpeg-python提供了方便的Python接口,但在某些情况下,你可能需要直接调用FFmpeg的命令行工具。
命令基本格式及参数

ffmpeg [global_options] {[input_file_options] -i input_url} ...{[output_file_options] output_url} ...

参数
主要参数:
◼ -i 设定输入流
◼ -f 设定输出格式(format)
◼ -ss 开始时间
◼ -t 时间长度
◼ -y 设定输出格式,输出时直接覆盖同名文件
◼ -c:指定编码器
◼ -c copy:直接复制,无需经过重新编码
◼ -c:v:指定视频编码器
◼ -c:a:指定音频编码器
◼ -an:去除音频流
◼ -vn:去除视频流

音频参数:
◼ -aframes 设置要输出的音频帧数
◼ -ab 音频码率
◼ -ar 设定采样率
◼ -ac 设定声音的Channel数
◼ -acodec 设定声音编解码器,如果用copy表示原始编解码数据必须被拷贝。
◼ -an 不处理音频
◼ -af 音频过滤器
ffmpeg -i test.mp4 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame -aframes 200 out2.mp3

视频参数:
◼ -vframes 设置要输出的视频帧数
◼ -b 设定视频码率
◼ -b:v 视频码率
◼ -r 设定帧速率
◼ -s 设定画面的宽与高
◼ -vn 不处理视频
◼ -aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
◼ -vcodec 设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。
◼ -vf 视频过滤器

ffmpeg -h
输出 ffmpeg 基本命令帮助信息,下面介绍下比较重要的配置选项

Print help / information / capabilities:
-L                  show license  // 显示许可信息 
-h topic            show help  // 显示帮助信息
-version            show version  // 显示版本				
-buildconf          show build configuration  // 显示编译配置
-formats            show available formats  // 显示可用格式 , 其等价于 muxers + demuxers 组合 
-muxers             show available muxers  // 显示可用的复用器
-demuxers           show available demuxers  // 显示可用的解复用器
-devices            show available devices  // 显示可用设备
-codecs             show available codecs  // 显示可用的编解码器 , 其等价于 encoders + decoders 组合
-decoders           show available decoders  // 显示可用的解码器
-encoders           show available encoders  // 显示可用的编码器
-bsfs               show available bit stream filters  // 显示可用的比特流 filters 过滤器 
-protocols          show available protocols  // 显示可用协议 , 如 rtmp , rtsp 等 ; 
-filters            show available filters  // 显示可用的过滤器 , 可用于 : 改变播放速度 , 加水印 , 加 Logo 
-pix_fmts           show available pixel formats  // 显示可用的像素格式
-layouts            show standard channel layouts  // 显示标准声道名称 
-sample_fmts        show available audio sample formats  // 显示可用的音频采样格式 
-colors             show available color names  // 显示可用的颜色名称 
-sources device     list sources of the input device  // 列出输入设备来源 
-sinks device       list sinks of the output device  // 列出输出设备接收器
-hwaccels           show available HW acceleration methods  // 显示可用的硬件加速方法 

这时,你可以使用Python的subprocess模块:

import subprocessinput_file = 'input.mp4'
output_file = 'output_custom.mp4'# 构建FFmpeg命令行
command = f"ffmpeg -i {input_file} -c:v libx264 -crf 23 {output_file}"# 执行命令行
subprocess.run(command, shell=True)

在这个例子中,我们使用了-c:v libx264来指定视频编码器为libx264,并使用-crf 23来设置CRF(Constant Rate Factor)值,这是一个影响视频质量和文件大小的参数。

总结

通过本文的讲解,我们深入探讨了ffmpeg-python库在Python中用于音视频处理的多个高级用例,包括调整帧率、视频转码、视频截图和视频拼接等。这些用例展示了ffmpeg-python库的强大功能和灵活性,使其成为Python开发者处理音视频数据的首选工具之一。希望这些示例和说明能够帮助你更好地理解和使用ffmpeg-python库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410857.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

06:【江科大stm32】:定时器输入捕获功能

定时器输入捕获功能 1、通过定时器的输入捕获功能测量PWM波的频率2、PWMI模式测量频率和占空比 1、通过定时器的输入捕获功能测量PWM波的频率 定时器标准库相关的编程接口: ①PWM.c文件的代码如下: /*通过定时器TIM2生成一个分辨率为10us,频率为1KHz的…

RabbitMQ中的死信交换机?(RabbitMQ延迟队列有了解过吗)

延迟队列 延迟队列:进入队列的消息会被延迟消费的队列。 延迟队列死信交换机 TTL(过期时间) 延迟队列的使用场景:超时订单、限时优惠、定时发布 死信交换机 当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter): 消费者使…

iOS工程:获取手机相册权限,iOS原生系统弹窗, Privacy隐私政策选择,如何添加系统弹出并修改描述文字

【iOS工程】获取手机相册权限,iOS原生系统弹窗, Privacy隐私政策选择,如何添加系统弹出并修改描述文字 设备/引擎:Mac(11.6)/Mac Mini 开发工具:Xcode(15.0.1) 开发需求&#xff…

【Java设计模式】Builder模式:在Java中清晰构建自定义对象

文章目录 【Java设计模式】Builder模式:在Java中清晰构建自定义对象一、概述二、Builder设计模式的意图三、Builder模式的详细解释及实际示例四、Java中Builder模式的编程示例五、Builder模式类图六、Java中何时使用Builder模式七、Builder模式的优点和权衡八、源码…

YOLO-World: Real-Time Open-Vocabulary Object Detection:实时开放词汇对象检测

YOLO系列探测器已成为高效实用的工具。然而,它们对预定义和训练的对象类别的依赖限制了它们在开放场景中的适用性。针对这一限制,我们引入了YOLO-World,这是一种创新方法,通过视觉语言建模和大规模数据集的预训练,增强…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建,发布 2. 利用 BAT 来一键部署…

Aigtek功率放大器应用领域分享:无处不在的MEMS传感器

微机电系统(MEMS,Micro-Electro-MechanicalSystem),也叫做微电子机械系统、微系统、微机械等,指尺寸在几毫米乃至更小的高科技装置。微机电系统其内部结构一般在微米甚至纳米量级。微机电系统是在微电子技术(半导体制造…

分布式基础理论——CAP理论和BASE理论

文章目录 CAP 理论BASE 理论参考资料 CAP 理论 CAP定理(CAP theorem)指出,在分布式系统中,设计读写操作时只能同时满足以下三个特性中的两个: 一致性(Consistency) : 所有节点访问同一份最新的…

ssm基于微信小程序的食堂窗口自助点餐系统源码调试讲解

1. 环境搭建 JDK 1.8:确保您的系统已安装JDK 1.8,并配置好环境变量。JDK 1.8 是目前很多Java项目仍在使用的稳定版本,适用于SSM框架。Tomcat 7:安装并配置Tomcat 7作为您的Web服务器。Tomcat 7 支持Servlet 3.0和JSP 2.2&#xf…

杰发科技AC7801——Flash模拟EEP内存(2)

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容,等到打印完成 计算符合,从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t,因此最大值是65536,写65536…

基于Pytorch框架的深度学习PSPnet网络动物马语义分割系统源码

第一步:准备数据 动物马分割数据,总共有328张图片,里面的像素值为0和1,所以看起来全部是黑的,不影响使用 第二步:搭建模型 psp模块的样式如下,其psp的核心重点是采用了步长不同,po…

前端:html+css:伪类画箭头(实心)

一、效果图 二、代码 html <div class"rectangle">AC/DC</div> css /* 图形 */ .rectangle {position: relative;width: 50px;height: 20px;background-color: #3498db;color: white; } .rectangle:before {content: ;position: absolute;top: 0;l…

Spring Boot Web开发实践:请求与响应参数的使用方法

主要介绍了请求响应的简单参数、实体参数、数组集合参数、日期参数、路径参数等各自的使用方法&#xff01;&#xff01;&#xff01; 文章目录 前言 Postman 简单参数 原始方式 SpringBoot方式 实体参数 数组集合参数 日期参数 路径参数 总结 前言 主要介绍了请求响应的简单参…

Tkinter Checkbutton设置了一个多选,为什么初始值都是勾选的:

代码如下&#xff1a; from tkinter import *master Tk()renyuan ["唐僧", "沙僧", "悟空", "八戒"]def r_change():rec ""ci 0for el in vars:rec el.get() "、"ci 1rec "九点" rec "离…

PHP概述-特点-应用领域-如何学习

老师建议注册使用百度文心一言&#xff1b;讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞&#xff1b;Kimi.ai - 帮你看更大的世界 等人工智能工具软件的一个到两个&#xff0c;也可下载文心一言、讯飞星火、kimi等APP软件使用&#xff0c;对于我们在读的大二学生来说有什么…

GPT-6曝光!阉割版「草莓」秋季兑现

夕小瑶科技说 原创 作者 | 海野 OpenAI的Q* 项目&#xff0c;也就是后来在网上沸沸扬扬的Strawberry草莓&#xff0c;终于定档于秋季上线。 据The Information爆料&#xff0c;作为GPT-4的下一代&#xff0c;Strawberry很惊艳&#xff1a; 拥有极强的推理和数学能力&#xf…

【人工智能 | 机器学习 | 理论篇】决策树(decision tree)

文章目录 1. 基本流程2. 划分选择2.1 信息增益2.2 增益率2.3 基尼系数 3. 剪枝处理3.1 预剪枝3.2 后剪枝 4. 连续与缺失值4.1 连续值处理4.2 缺失值处理 5. 多变量决策树 1. 基本流程 二分类任务决策树流程&#xff1a; 决策树&#xff1a;包含 1个根结点、若干个内部结点、若…

vue.js3+element-plus+typescript add,edit,del,search

vite.config.ts server: {cors: true, // 默认启用并允许任何源host: 0.0.0.0, // 这个用于启动port: 5110, // 指定启动端口open: true, //启动后是否自动打开浏览器 proxy: {/api: {target: http://localhost:8081/, //实际请求地址&#xff0c;数据库的rest APIschangeOr…

Maven Wrapper深入实战

概述 官网&#xff0c;GitHub。 Maven Wrapper&#xff0c;缩写为mvnw&#xff0c;是一个受Gradle Wrapper和Takari Wrapper启发而产生的Maven子项目&#xff0c;主要有以下三个用途&#xff1a; 让开发者电脑上无需安装Maven&#xff0c;也不用配置环境变量&#xff0c;即可…

【案例63】SSL RC4 加密套件支持检测 (Bar Mitzvah)修复方案

漏洞详情信息 漏洞名称 SSL RC4 加密套件支持检测 (Bar Mitzvah) 漏洞等级 高 漏洞描述 远程主机支持在一个或多个密码组中使用 RC4。 RC4 密码在伪随机字节流的生成中存在缺陷&#xff0c;导致引入了各种各样的小偏差&#xff0c;降低了其随机 性。 如果反复加密明文&am…