ffmpeg下载安装及截取视频帧

441 阅读1分钟

ffmpeg下载安装及截取视频帧

1.下载安装ffmpeg

本篇介绍mac版安装方式

下载

  1. 使用brew命令下载 注意这个方式太慢了

  2. 官网下载安装

    官网下载对应系统下的ffmpeg文件.传送门 .mac版 mac版

  3. 下载后解压,得到一个ffmpeg文件

image.png

  1. 记录该文件的位置 可以打开终端输入pwd对路径进行复制保存

安装

  1. 打开终端
  2. 配置环境变量:
    • 打开配置文件 open -e ~/.zshrc
    • 将export PATH="/Users/jiangfulai/Downloads/ffmpeg:$PATH"添加至文件中
    • 保存关闭
    • 执行 source ~/.zshrc
  3. 验证 ffmpeg -version

可以看到已经安装成功啦。

2. 截取视频帧图片

单个文件

ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 output.jpg

参数智能解释:

  • ffmpeg:这是命令行中调用FFmpeg程序的命令。FFmpeg是一个非常强大的开源多媒体处理工具,可以用来录制、转换数字音视频,并能将其转化为流。
  • -i input.mp4-i 参数后面跟的是输入文件的路径和名称。例子中,input.mp4 是要处理的视频文件。
  • -ss 00:00:05:这个参数指定了从视频的哪个时间点开始处理。00:00:05 表示从视频的第5秒开始。
  • -vframes 1:这个参数指定了要处理的视频帧数。1 表示只处理一帧,即从这个视频中提取一张图片。
  • output.jpg:这是输出文件的名称和格式。在这个例子中,输出的是一张JPEG格式的图片,文件名为output.jpg

当然资源可以是网络资源

ffmpeg -i https://xxxxx/2.mp4 -ss 00:00:05 -frames:v 1 -f image2 output.jpg

批量处理

批量处理的方式很多,我自己遇到的是一个各种嵌套的文件夹下,不一定哪个层次有mp4文件,需要对所有视频进行截取一帧图片并将图片保存在同视频目录下。

不过呢,因为我这个之前处理其他需求已经有一个json文件,记录了各视频的位置, 如下

[
    {"path": "/Vxx/public/备份/xx素材/视频2/测试.mp4", "name": "测试"},
    {"path": "/Vxx/public/备份/xx素材/视频2/测试2.mp4", "name": "测试2"},
    {"path": "/Vxx/public/备份/xx素材/视频1/检验基础课程课件/录像/xxx/第一讲测试.mp4", "name": "第一讲测试"},
    {"path": "/Vxx/public/备份/xx素材/视频1/检验基础课程课件/录像/xxx/第一讲测试2.mp4", "name": "第一讲测试2"},
    ...
]

这样降低了难度,

批量处理脚本:(依赖python环境)

#!/bin/bash  
  
# JSON文件路径  
json_file="1.json"  
  
# 使用Python解析JSON并遍历每个元素  
python3 -c "  
import json  
import sys  
import os  
import subprocess  
  
# 读取JSON文件  
with open(sys.argv[1], 'r') as file:  
    data = json.load(file)  
  
# 遍历JSON数组中的每个元素  
for item in data:  
    video_path = item['path']  
    video_name = item['name']  
    video_dir = os.path.dirname(video_path)  
    output_image = os.path.join(video_dir, f'{video_name}.jpg')  
      
    # 检查视频文件是否存在  
    if not os.path.isfile(video_path):  
        print(f'Warning: Video file {video_path} does not exist. Skipping.')  
        continue  # 跳过当前循环迭代,继续处理下一个视频  
      
    # 使用ffmpeg从视频中截取图片  
    try:  
        subprocess.run(['ffmpeg', '-i', video_path, '-ss', '00:00:05', '-vframes', '1', output_image], check=True)  
        print(f'Successfully extracted image from {video_path} to {output_image}')  
    except subprocess.CalledProcessError as e:  
        print(f'Failed to extract image from {video_path}: {e}')  
" "$json_file"

至此,单个视频取帧 及批量取帧已经实现啦。

记录一下~