Python基于FFMPEG自动截图上传至imgbox(一)

本文最后更新于:1 年前

前言


玩PT的大概都知道发布的时候要上传mediainfo和截图,无论内外站都支持的图床之一就是imgbox。而无论是盒子还是本地,mediainfo或者截图上传都是比较繁琐枯燥的一件事情。那么,基于此,工具就来了。

这是一个比较系统的工具了,会用到一系列基础知识,所以打算做成一个系列。

本篇文章为第一篇:如何自动截取视频截图?

FFMPEG


总之FFMPEG的功能十分强大,无论是windows还是linux都可以使用。而今天我们主要说明如何使用该工具进行截图。废话不多说,直接上代码。

ffmpeg -ss {timestring} -y -i "{file}" "-f" "image2" "-frames:v" "1" "-c:v" "png" "-loglevel" "8" "{img_path}"

# 参数说明
# -ss................指定视频文件中截图的时间,01:00:00表示从视频文件的第一个小时截图
# -y.................表示覆盖,如果存在同名文件直接覆盖
# -i.................指定输入文件,使用双引号避免文件路径存在空格
# -f.................指定输出格式,image2表示输出图片
# -frames............指定截取几帧,这里指定为1
# -c.................编码格式,指定输出为png
# -loglevel..........日志等级相关参数,这里设置为8
# 最后img_path代表输出文件路径,包含文件名。
# 更多细节可以直接调用"ffmpeg -h"进行学习。

很显然的一个问题,ffmpeg需要指定截图时间,那么视频有多长,什么时候开始截取呢?我们需要知道这个视频的长度。mediainfo便是一个很好的工具,而且ffmpeg直接就封装了mediainfo,可以直接使用指令获取视频信息:

ffmpeg -i test.mkv

ffmpeg

忽略中文乱码我们其实可以获取到视频得长度的。其实我们还有一个python模块可以干这件事。pymediainfo使用代码示范:

from pprint import pprint
from pymediainfo import MediaInfo

media_info = MediaInfo.parse("my_video_file.mp4")
for track in media_info.tracks:
    if track.track_type == "Video":
        print("Bit rate: {t.bit_rate}, Frame rate: {t.frame_rate}, "
              "Format: {t.format}".format(t=track)
        )
        print("Duration (raw value):", track.duration)
        print("Duration (other values:")
        pprint(track.other_duration)
    elif track.track_type == "Audio":
        print("Track data:")
        pprint(track.to_data())

得到的结果如下:

Bit rate: 3117597, Frame rate: 23.976, Format: AVC
Duration (raw value): 958
Duration (other values):
['958 ms',
 '958 ms',
 '958 ms',
 '00:00:00.958',
 '00:00:00;23',
 '00:00:00.958 (00:00:00;23)']
Track data:
{'bit_rate': 236392,
 'bit_rate_mode': 'VBR',
 'channel_layout': 'L R',
 'channel_positions': 'Front: L R',
 'channel_s': 2,
 'codec_id': 'mp4a-40-2',
 'commercial_name': 'AAC',
 'compression_mode': 'Lossy',
 …
}

总结


我们现在知道了ffmpeg的截图命令,也知道了怎么获取一个视频文件的时长,可能形式需要转换一下。那么在已知视频文件路径的前提下,如何用python进行截图操作呢?预知后事,请听下回分解。



本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!