1 FFmpeg 介绍
FFmpeg[1] 主要网站:
官网:https://www.ffmpeg.org/
Github地址:https://github.com/FFmpeg/FFmpeg
1.1 ffmpeg 组成[2]
构成 FFmpeg 主要有三个部分:
- 第一部分是四个作用不同的工具软件,分别是:
-
ffmpeg.exe
:音视频转码、转换器 -
ffplay.exe
:简单的音视频播放器 -
ffserver.exe
:流媒体服务器 -
ffprobe.exe
:简单的多媒体码流分析器
-
- 第二部分是可以供开发者使用的 SDK,为各个不同平台编译完成的库。如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:
-
libavcodec
:包含音视频编码器和解码器 -
libavutil
:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能 -
libavformat
:包含多种多媒体容器格式的封装、解封装工具 -
libavfilter
:包含多媒体处理常用的滤镜功能 -
libavdevice
:用于音视频数据采集和渲染等功能的设备相关 -
libswscale
:用于图像缩放和色彩空间和像素格式转换功能 -
libswresample
:用于音频重采样和格式转换等功能
-
- 第三部分是整个工程的源代码,无论是编译出来的可执行程序还是 SDK,都是由这些源代码编译出来的。FFmpeg 的源代码由C语言实现,主要在 Linux 平台上进行开发。FFmpeg 不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以 FFmpeg 的工具和 SDK 的调用为主。到下一系列我们将专门研究如何编译源代码并根据源代码来进行二次开发。
1.2 在 Windows 上安装 FFmpeg
首先进入 https://ffmpeg.zeranoe.com/builds/ 下载安装包[3]:
在下载页面上,我们可以看到,对于32位和64位版本,分别提供了三种不同的模式:
- static: 该版本提供了静态版本的 FFmpeg 工具,将依赖的库生成在了最终的可执行文件中;作为工具而言此版本就可以满足我们的需求;
- share: 该版本的工具包括可执行文件和 dll,程序运行过程必须依赖于提供的 dll 文件;
- dev: 提供了库的头文件和 dll 的引导库;
这里我选择 static
版本的,之后将下载到文件压缩包解压到合适的位置并重命名为 ffmpeg
,接着将该文件夹下的 bin
文件夹添加到系统环境变量的 Path
中。最后,可以在终端输入 ffmpeg -version
进行测试:
2 直接使用 Python 操作 FFmpeg
2.1 按照时间将视频转为图片
import subprocess
def get_image(video_path, image_path):
img_count = 1
crop_time = 0.0
while crop_time <= 15.0:# 转化 15s 的视频
cmd_str = f'ffmpeg -i {video_path} -f image2 -ss {crop_time} -vframes 1 {image_path}/{img_count}.png'
subprocess.run(cmd_str, encoding="utf-8" , shell=True)
img_count += 1
print(f'Geting Image {img_count}.png from time {crop_time: .5g}')
crop_time += 2 # 每 2 秒截取一张照片
print('视频转化完成!!!')
ffmpeg
后面的参数 -i
需要传入要处理的文件名,-f
指定音频或者视频的格式,-vframes
设置转换多少帧的视频,-ss
从指定的时间(秒)截图。
对于 subprocess.run
如果报找不到文件的错误,必须设置 shell=True
。
2.2 批量转换视频为图片
from pathlib import Path
import subprocess
def mkdir(root_dir):
'''依据给定名称创建目录'''
path = Path(root_dir)
if not path.exists():
path.mkdir()
def save_image(video_path, image_dir, fps):
cmd_str = f'ffmpeg -i {video_path} -f image2 -r {fps} {image_dir}/%d.png'
subprocess.run(cmd_str, encoding="utf-8" , shell=True)
print('视频转化完成!!!')
def batch(root, out_root, fps):
for video_path in root.glob('*.mp4'): # 仅仅支持二级目录
image_dir = out_root/video_path.name.split('.')[0]
mkdir(image_dir) # 如果不存在,则创建
save_image(video_path, image_dir, fps)
3 使用 ffmpeg-python 操作 FFmpeg
需要使用 ffmpeg-python 进行操作。
4 使用 PyAV 操作 FFmpeg
学习资料:PyAV Documentation
PyAV 并不好安装,最好使用如下方式安装:
conda install av -c conda-forge
-
是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库
libavcodec
,为了保证高可移植性和编解码质量,libavcodec
里很多 code 都是从头开发的。FFmpeg 在 Linux 平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括 Windows、Mac OS X 等。这个项目最早由 Fabrice Bellard 发起,2004 年至 2015年间由 Michael Niedermayer 主要负责维护。许多 FFmpeg 的开发人员都来自 MPlayer 项目,而且当前 FFmpeg 也是放在 MPlayer 项目组的服务器上。项目的名称来自 MPEG 视频编码标准,前面的"FF"代表"Fast Forward"。 ↩ -
参考 Python - FFmpeg ↩
-
其他版本的可参考:https://www.ffmpeg.org/download.html ↩