Shell 结合 ffmpeg 压缩视频图片

271 阅读2分钟

使用shell 脚本实现快速压缩视频/ 图片

目的: 记录相关代码片段

代码如下:

#!/bin/bash
echo "压缩启动"

# 获取命令行参数
# ys.sh ./ 当前目录
input_dir=$1
output_dir=$1/output

# 检查输入参数是否为空
if [ -z "$input_dir" ] || [ -z "$output_dir" ]; then
    echo "请输入: $0 <input_directory> <output_directory>"
    exit 1
fi

# 如果输出目录不存在,创建该目录
if [ ! -d "$output_dir" ]; then
    mkdir -p "$output_dir"
fi


# # 压缩视频函数
# function compress_video {
#     echo "正在压缩视频: $1"
#     # 使用 ffmpeg 进行压缩
#     # ffmpeg -i "$file" -codec:v libx264 -crf 23 -preset medium -codec:a aac -b:a 128k -movflags +faststart "$output_dir/$filename_no_ext.$extension"
#     # ffmpeg -i "$file"  "$output_dir/$filename_no_ext.$extension",  下面的压缩最厉害
#     ffmpeg -i "$file" -codec:v libx264 -crf 28 -preset slow -b:a 64k  "$output_dir/$filename_no_ext.$extension"
# }

# # 压缩图片函数
# function compress_image {
#     echo "正在压缩图片: $1"
#     ffmpeg -i "$1" -vf "scale=iw:ih" "compressed_$1"
# }

# 遍历输入目录中的所有视频文件
for file in "$input_dir"/*
do
    if [ -f "$file" ]; then
        filename=$(basename -- "$file")
        extension="${filename##*.}"
        filename_no_ext="${filename%.*}"
        if [[ "$file" =~ \.(mp4|avi|mov)$ ]]; then
        
            # 使用 ffmpeg 进行压缩
            # ffmpeg -i "$file" -codec:v libx264 -crf 23 -preset medium -codec:a aac -b:a 128k -movflags +faststart "$output_dir/$filename_no_ext.$extension"
            # ffmpeg -i "$file"  "$output_dir/$filename_no_ext.$extension",  下面的压缩最厉害
            ffmpeg -i "$file" -codec:v libx264 -crf 28 -preset slow -b:a 64k  "$output_dir/$filename_no_ext.$extension"
        
        echo "压缩完成:$filename"

        elif [[ "$extension" =~ ^(jpg|jpeg|png)$ ]]; then
            # 处理图片文件
            # 做你想要的图片处理操作
            # 这里只是简单的复制到输出目录
            # cp "$file" "$output_dir/$filename"
                # -vf "scale=iw:ih"

            ffmpeg -i "$file"  "$output_dir/$filename_no_ext.$extension"

            # base64
            base64_image=$(base64 -w 0 "$output_dir/$filename_no_ext.$extension")
            echo "data:image/$extension;base64,$base64_image" > "$output_dir/$filename_no_ext.txt"
            echo "处理完成:$filename"

        fi    
    fi
done

echo "所有视频文件压缩完成!"
# 保持窗口存在的方式
# read -p "Press any key to continue"
# sleep 60  # 等待60秒后关闭窗口
# exec bash # 启用一个新的进程替代当前 

这里命名为ys.sh 简短一些输入比较快

shell 相关命令 www.runoob.com/linux/linux…

这里有个前提就是需要 电脑已经安装了ffmpeg 然后自动化执行批量操作 安装地址

配置相关的环境变量 image.png

如果要调节压缩参数, 请参考ffmpeg 的相关参数配置

用法:

  1. ./ys.sh 'xxx/yyy' 后面带的参数,xxx/yyy 是指目标目录, 其中的大致视频格式, 以及目录下的图片都会执行批量压缩操作, 统一输出到 当前目录的 output/ 下; 这里注意一下,一定是'./' 开头, 如果直接ys.sh 会去全局寻找相关的同名文件

  2. 如果对转图片base64 不需要的话, 可以注释下面的 生成base64文本操作