前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编写批处理文件,调用ffmpeg抽帧

编写批处理文件,调用ffmpeg抽帧

原创
作者头像
JQ实验室
发布2023-03-01 18:07:16
9680
发布2023-03-01 18:07:16
举报
文章被收录于专栏:实用技术实用技术
有需求如下:

一个文件目录下有多个视频,需要对每个视频进行抽帧,并保存到图片文件夹内;

需求分析:

对视频抽帧可以使用ffmpeg,遍历文件目录可以使用批处理;

功能实现:

编写批处理文件,遍历文件夹下所有视频文件,然后对每个视频调用ffmpeg抽帧;

  1. 遍历文件夹下所有mp4文件:使用for循环set src_dir=J:\Download\post for %%a in (%src_dir%\*.mp4) do ( echo %%a )setlocal enableextensions enabledelayedexpansion SET /A COUNT=1 for .... do ( SET /A COUNT+=1 mkdir %src_dir%\!COUNT! ) endlocalsetlocal enabledelayedexpansion 是什么意思?设置本地为延迟扩展。其实也就是:延迟变量,全称"延迟环境变量扩展",
  2. 创建存放抽帧图片的文件夹

在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。

  1. 调用ffmpeg抽帧ffmpeg -i "%%a" -r 5 -vf scale=-1:960 "%srcdir%/png/!COUNT!/img%%03d.png"

完整代码如下

代码语言:text
复制
chcp 65001
setlocal enableextensions enabledelayedexpansion
@echo off
echo start....
set src_dir=J:\Download\post
echo %src_dir%
SET /A COUNT=1

for %%a in (%src_dir%\*.mp4) do (
    SET /A COUNT+=1
    echo %%a
    echo !COUNT!
    rem mkdir %src_dir%\!COUNT! 创建文件夹
    echo '开始抽帧' 
    rem echo 
    ffmpeg -i "%%a" -r 5 -vf scale=-1:960 "%src_dir%/png/!COUNT!/img_%%03d.png"
    pause
)
endlocal
pause

为了解决输出乱码,需要添加如下代码:

chcp 65001

而@echo off则表示

执行了这条命令后关闭所有命令(包括本身这条命令)的回显。而echo off命令则表示关闭其他所有命令(不包括本身这条命令)的回显,@的作用就是关闭紧跟其后的一条命令的回显;

抽帧处理的图片:

在这里插入图片描述
在这里插入图片描述

发现一个问题:

原视频大小时500k,而抽帧出来后,每个图片大概有1M左右,感觉图片太大了;

尝试压缩一下图片

图片压缩

  • 使用ffmpeg命令ffmpeg -i src.png -q 5 dest.png

发现压缩效果一般,只减少了几十k;

  • 使用tinypng

tinypng官网地址:访问

在这里插入图片描述
在这里插入图片描述

在官网地址可以测试图片压缩;发现压缩了80%;

官网上也提供了api,只需要申请一下key就可以调用;

每个apiKey,每月可以免费调用500个图片

在这里插入图片描述
在这里插入图片描述

使用python调用,首先安装tinify

pip install --upgrade tinify

编码实现:

代码语言:python
代码运行次数:0
复制
import tinify
tinify.key = "YOUR_API_KEY"
source = tinify.from_file("src.png")
source.to_file("optimized.png")```

由于使用tinypng有次数限制,所以又尝试使用ffmpeg,通过搜索,找到如下方式,经测试可以实现压缩70%;

代码语言:txt
复制
ffmpeg -i in.png -vf palettegen=max_colors=256:stats_mode=single -y tmp.png
ffmpeg -i in.png -i tmp.png -lavfi "[0][1:v] paletteuse" -pix_fmt pal8 -y out.png

ffmpeg -i in.png -vf palettegen=max_colors=256:stats_mode=single -y tmp.png

这里的输出结果是一个调色板 并不是完整图像 由于这是单张静图所以mode使用的是single ffmpeg -i in.png -i tmp.png -lavfi "0 paletteuse" -pix_fmt pal8 -y out.png

再用优化过的调色板去转换 得到结果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 有需求如下:
  • 需求分析:
  • 功能实现:
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档