ffmpeg linux shell脚本 批量将图片合成视频

Linux装ffmpeg 如果没有设置全局变量 那么需要进入到ffmpeg目录下 然后./ffmpeg 这样子才能执行命令

#!/bin/bash

# 定义父目录路径,存放子目录的根目录
parent_dir="/home/xxx/res"

# 定义输出目录路径,视频文件将保存于此
output_dir="/home/xxx/output"

# 确保输出目录存在,若不存在则创建
mkdir -p "$output_dir"

# 遍历父目录下的每一个子目录
for sub_dir in "$parent_dir"/*/; do
    # 输出当前处理的子目录名称,去掉末尾的斜杠
    echo "Sub Directory Name: ${sub_dir%/}"

    # 获取子目录的基本名称
    base_name=$(basename "$sub_dir")

    # 构建图像文件的基本路径
    image_base_path="$sub_dir"

    # 图像文件的模式,用于匹配如name_00001.jpg的文件
    image_pattern="$image_base_path${base_name}_%05d.jpg"

    # 输出视频文件的全路径
    output_video="$output_dir/$base_name.mp4"

    # 开启nullglob,使未匹配到任何文件时返回空而不返回原样字面
    shopt -s nullglob

    # 使用find命令检查是否存在匹配的图像文件
    if find "$image_base_path" -maxdepth 1 -regextype posix-extended -regex ".*/${base_name}_[0-9]{5}\.jpg" | read; then
        # 打印正在处理的图像路径信息
        echo "Processing images in: $image_base_path"
        echo "Image Pattern: $image_pattern"
        echo "Output Video: $output_video"

        # 调用ffmpeg将图像序列转换为视频
        # -framerate 30 设置帧率为每秒30帧
        # -pattern_type glob 允许使用通配符匹配文件
        # -i 指定输入文件模式
        # -c:v libx264 使用H.264视频编码器
        # -pix_fmt yuv420p 设置像素格式,广泛兼容
        # -vf scale=1920x1080 视频缩放至1920x1080分辨率
        ./soft/ffmpeg-6.1/ffmpeg -framerate 30 -pattern_type glob -i "$image_base_path${base_name}_*.jpg" -c:v libx264 -pix_fmt yuv420p -vf scale=1920x1080 "$output_video"

        # 检查上一命令的退出状态码,0表示成功
        if [ $? -eq 0 ]; then
            echo "Video created successfully: $output_video"
        else
            # 如果ffmpeg处理出错,打印错误信息
            echo "An error occurred while processing $image_base_path"
        fi
    else
        # 当前子目录中没有找到匹配的图像文件时打印提示
        echo "No matching image files found in $image_base_path"
    fi
done

# 所有子目录处理完成后打印结束信息
echo "All directories have been processed."

详解:

这段脚本是一个bash脚本,其主要功能是在指定的父目录下查找子目录,并将每个子目录中的符合特定命名规则的图像文件(如name_00001.jpg)合并成一个MP4视频文件。以下是脚本的详细步骤和说明:
变量定义:
parent_dir: 指定了需要遍历的父目录路径。
output_dir: 定义了输出视频文件的目录路径。
创建输出目录:
使用mkdir -p "$output_dir"确保输出目录存在,如果不存在则创建。
遍历子目录:
使用for循环和通配符*/来遍历parent_dir下的所有子目录。
处理每个子目录:
输出当前处理的子目录名称。
使用basename获取子目录的基本名称(不包含路径)。
设置image_base_path为当前子目录路径。
构建图像文件的模式字符串,用于匹配如name_%05d.jpg的文件。
定义输出视频文件的完整路径。
检查图像文件:
开启nullglob选项以避免没有匹配项时返回空字符串而非原模式。
使用find命令配合正则表达式检查是否存在匹配的图像文件。
如果找到匹配的图像文件,则进入处理逻辑;否则,打印提示信息并继续下一个子目录。
转换图片到视频:
调用位于./soft/ffmpeg-6.1/ffmpeg的FFmpeg工具,设置帧率为30fps,使用glob模式匹配所有符合命名规则的图像文件。
指定视频编码器为libx264,像素格式为yuv420p,视频分辨率设为1920x1080。
将处理结果输出到之前定义的output_video路径。
根据FFmpeg的执行结果判断是否成功创建视频,并给出相应的提示信息。
完成处理:
遍历所有子目录后,打印一条消息表示所有目录已处理完毕。
该脚本是一个自动化处理图像序列生成视频的实用工具,适合于批量处理大量图像数据到视频的场景,如动画制作、监控视频合成等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值