【FFmpeg命令】jpg与yuv(批量)互转

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源程序,其命令行十分丰富。

关于FFmpeg的安装与配置,上一篇博文已经做过介绍了,此文不再赘述。本文重点讲解如何使用 FFmpeg 命令行实现 jpg 与 yuv 图像格式的相互转换,并支持批量化。

1. 单图像jpg转yuv

倘若当前目录下有个jpg文件,名为000001_353x500.jpg,可用如下语句将其转换为yuv格式,并将新yuv文件命名为000001_353x500.yuv.

ffmpeg -pix_fmt yuv420p -s 353x500 -i 000001_353x500.jpg 000001_353x500.yuv

这里,-pix_fmt表示pixel format,指定像素格式,这里指定为yuv420p格式;
-s表示size,后以宽x高格式指定图像的宽高大小;
-i表示input,后接输入文件的url;

最后,指定output输出文件的url.

2. 单图像yuv转jpg

倘若当前目录下有个yuv文件,名为000001_353x500.yuv,可用如下命令将其转换为jpg格式,并将新jpg文件命名为000001_353x500.jpg.

ffmpeg  -s 353x500 -i 000001.yuv 000001.jpg -y

这里,-s表示size,后接了输入yuv文件的图像大小;
-i表示input文件的url;
然后接output输出文件的url;
最后,-y是一个通用选项,表示当前目录下倘若存在相同输出文件名,则直接替代它。

如果不加-y,遇到输出url已存在一个相同输出文件名文件,命令行会中断当前程序,询问是否覆盖文件:

File '000001_353x500.yuv' already exists. Overwrite? [y/N]

y覆盖,N不覆盖。

3. 批量jpg转yuv

到此已经会使用FFmpeg命令实现jpg和yuv的相互转换,想想还蛮激动的,正想交差呢,结果老板突然来了一句“帮我这10000张jpg图片都转换yuv一下”,瞬间原地去世……

大量数据集一条一条手动输命令本身就很麻烦,再加上不同图像-s参数不同,给的图像名也没有包含图像大小信息,难道还要一个一个属性查看设置,献身于重复劳动力的伪业吗?

迅哥说过:“学语言不会用等于白学。”这里不就有一个锻炼的好机会!本人没学过脚本,但学过python,所以接下来的解决方案将基于python.

3.1 bat文件

在说实现思路前,还得说说bat文件

bat文件是dos下的批处理文件,它包含一条或多条命令。它的文件扩展名为.bat.cmd。在命令提示下输入批处理文件的名称,或者双击该批处理文件,系统就会调用cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们 。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。(来源百度)

这么好用,安排安排~

3.2 python的PIL模块

注:倘若给定的图像集的文件名已包含图像大小信息,此步可省略!!!

PythonWare公司提供了免费的图像处理工具包PIL(Python Image Library),该软件包提供了基本的图像处理功能,其中当然包括读取图像的的大小。

PIL历史悠久,原来是只支持python2.x的版本的,后来移植到了python3的库pillow,我安装了python3.7,所以安装命令为:

pip install pillow

新键py文件,导入包:

from PIL import Image

#提取py文件所在目录下的000001.jpg图像大小
jpgName="000001.jpg"
jpgSize = Image.open(jpgName).size
print(jpgSize)

输出结果以元组表示 (width, height):

(353, 500)

3.3 实现思路

既然每转换一张图像都需要一条对应命令,并设置对应参数,那我们就可以写一个py文件:

1.读取文件夹下的所有图像;
2.每读一个图像就读取它的图像大小并生成对应jpg转换yuv命令语句;
3.将所有图像的命令集成写到一个bat文件;
4.运行py文件,执行bat文件(双击即可)。

3.4 参考代码

import os
from PIL import Image

# jpg文件夹路径
jpg_path = r'D:\image\jpg'
# yuv输出文件夹路径
yuv_path = r'D:\image\yuv'
# 生成的bat文件路径
batfile_path = r'D:\image/cmd_list.bat'

if not os.path.exists(jpg_path):
    print("jpg文件不存在!")
    exit(0)
if not os.path.exists(yuv_path):
    os.mkdir(yuv_path)
    
# cmd语句集合
cmd_str = ""

# 读取文件夹下全部文件名,文件名格式:序号.jpg
jpg_list = os.listdir(jpg_path)
# change directory到指定目录下
os.chdir(jpg_path)
for jpg_name in jpg_list:
    jpg = Image.open(jpg_name)
    jpgSize = jpg.size  # (宽,高)
    x = jpg_name.split('.')  # (序号,扩展名)
    # 重命名格式:序号_宽x高.
    yuv_name = x[0] + '_' + str(jpgSize[0]) + 'x' \
    				+ str(jpgSize[1]) + '.yuv'
    
    #例ffmpeg -pix_fmt yuv420p -s 500x375 -i D:\image\jpg/000006.jpg D:\image\yuv/000006_500x375.yuv -y
    cmd_str += \
        "ffmpeg -pix_fmt yuv420p -s " + str(jpgSize[0]) + "x" + str(jpgSize[1])+ " -i "+ jpg_path + "/" +jpg_name+" "+yuv_path + "/" + yuv_name + " -y\n"
#防止命令运行完窗口自动退出
cmd_str+="pause"

# 生成bat文件
outf = open(batfile_path, 'w')
outf.write(cmd_str)
outf.close()

以上代码亲测可试,但需要注意图像命名格式。此外,三个文件路径改成自己的,且保证文件夹下只有图像,无其他无关文件。

生成bat文件后,双击即可执行。

3.5 小问题

下面命令也能执行,且也能生成yuv文件,但我不是很清楚其与前者处理机制是否相同,希望知道的朋友能帮忙解答,感激。

ffmpeg -i 000001.jpg 000001.yuv

4. 批量yuv转jpg

有了批量jpg转yuv的经验,yuv转jpg也是类似的,这里不多赘述了,举一反三嘛~一般yuv文件会直接把大小信息嵌入文件名,直接上代码吧。

import os

# jpg文件夹路径
jpg_path = r'D:\image\jpg2'
# yuv文件夹路径
yuv_path = r'D:\image\yuv'

# 生成的bat文件路径
batfile_path = r'D:\image/cmd_list2.bat'

# cmd语句集合
cmd_str = ""

if not os.path.exists(yuv_path):
    print("jpg文件不存在!")
    exit(0)
if not os.path.exists(jpg_path):
    os.mkdir(jpg_path)

# 读取文件夹下全部文件名,文件名格式:序号_宽x高.yuv
yuv_list = os.listdir(yuv_path)
# change directory到指定目录下
os.chdir(yuv_path)
for yuv_name in yuv_list:
    x = yuv_name.split('.')  # (序号_宽x高,扩展名)
    y=x[0].split('_')   #(序号,宽x高)
    #例ffmpeg -s 500x375 -i D:\image\yuv/000006_500x375.yuv \
    #D:\image\jpg2/000006_500x375.jpg -y
    cmd_str += \
        "ffmpeg -s "+y[1]+" -i " + yuv_path + "/" +yuv_name + " " \
        + jpg_path + "/" + x[0] + ".jpg -y\n"
cmd_str+="pause"

# 生成bat文件
outf = open(batfile_path, 'w')
outf.write(cmd_str)
outf.close()

同样,注意路径和命名,运行py文件,生成bat文件双击即运行。

更多命令可查看官方文档

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值