看视频的时候是不是经常遇到不恰当的横向拍摄或者竖向拍摄,不恰当的手持拍摄角度,最后势必会影响到观影效果。
所以经常遇到原本是要横屏观看的,结果视频是竖着的,当然,在手机上面看是没有这困扰的,如果是电脑,就要设置播放器。
小编是个强迫症的人,一定要把视频素材角度还原到它该有的位置。小编书读的不多,要求还挺多,凭着对FFMPEG一点点的了解,和bash的一点点了解,
这个问题当然能解决,但效率不高。
上个月,突然想到DEEPSEEK,于是奇怪的知识又灌输到我脑子里了。
问题困境:如何将以下5个竖向视频批量性变成横向?
实现的效果如下(横向)
当然这难不倒DS,给出的答案是
以下针对视频文件1.mp4到5.mp4的批量旋转示例:
1. 创建测试文件
“`bash
# 先创建5个测试视频文件(如果没有的话)
for i in {1..5}; do
ffmpeg -f lavfi -i testsrc=duration=10:size=640×480:rate=30 \
-c:v libx264 -pix_fmt yuv420p “${i}.mp4”
done
“`
2. 基本批量旋转命令
“`bash
# 最简单的批量旋转
for i in {1..5}; do
ffmpeg -i “${i}.mp4” -vf “transpose=1” -c:a copy “rotated_${i}.mp4”
done
“`
3. 带进度显示的批量旋转
“`bash
#!/bin/bash
# 批量旋转1.mp4到5.mp4,带进度显示
echo “开始批量旋转视频…”
for i in {1..5}; do
input=”${i}.mp4″
output=”rotated_${i}.mp4″
if [ -f “$input” ]; then
echo “正在处理: $input → $output”
ffmpeg -i “$input” -vf “transpose=1” -c:a copy “$output” -y
echo “✓ 完成: $output”
else
echo “✗ 文件不存在: $input”
fi
done
echo “所有视频处理完成!”
ls -la rotated_*.mp4
“`
4. 使用数组指定文件
“`bash
#!/bin/bash
# 使用数组明确指定要处理的文件
videos=(“1.mp4” “2.mp4” “3.mp4” “4.mp4” “5.mp4”)
echo “开始处理指定视频文件…”
for video in “${videos[@]}”; do
if [ -f “$video” ]; then
output=”rotated_${video}”
echo “处理: $video”
ffmpeg -i “$video” -vf “transpose=1” -c:a copy “$output”
else
echo “警告: $video 不存在”
fi
done
“`
5. 并行处理加速
“`bash
# 使用xargs并行处理(同时处理2个)
echo {1..5}.mp4 | xargs -n 1 -P 2 -I {} bash -c ‘
echo “处理: {}”
ffmpeg -i “$1” -vf “transpose=1” -c:a copy “rotated_$1″
‘ _ {}
“`
6. 生成处理报告
“`bash
#!/bin/bash
# 批量处理并生成报告
log_file=”rotation_report.txt”
echo “视频旋转处理报告 – $(date)” > “$log_file”
echo “==========================” >> “$log_file”
for i in {1..5}; do
input=”${i}.mp4″
output=”rotated_${i}.mp4″
if [ -f “$input” ]; then
echo “处理中: $input” | tee -a “$log_file”
start_time=$(date +%s)
ffmpeg -i “$input” -vf “transpose=1” -c:a copy “$output” -y 2>&1 | tee -a “$log_file”
end_time=$(date +%s)
duration=$((end_time – start_time))
echo “✓ 完成: $output (耗时: ${duration}s)” | tee -a “$log_file”
echo “—” >> “$log_file”
else
echo “✗ 跳过: $input (文件不存在)” | tee -a “$log_file”
fi
done
echo “处理完成!查看报告: $log_file”
“`
7. 单行命令快速处理
“`bash
# 最简洁的单行命令
for i in {1..5}; do ffmpeg -i “$i.mp4” -vf “transpose=1” -c:a copy “rotated_$i.mp4”; done
“`
8. 检查处理结果
“`bash
# 处理完成后检查文件
echo “处理前文件:”
ls -la [1-5].mp4
echo -e “\n处理后文件:”
ls -la rotated_*.mp4
# 检查视频信息
echo -e “\n旋转后的视频信息:”
for i in {1..5}; do
if [ -f “rotated_$i.mp4” ]; then
echo “=== rotated_$i.mp4 ===”
ffmpeg -i “rotated_$i.mp4” 2>&1 | grep -E “Stream|Duration”
fi
done
“`
执行示例:
“`bash
# 给脚本执行权限
chmod +x rotate_videos.sh
# 运行脚本
./rotate_videos.sh
# 或者直接运行命令
for i in {1..5}; do ffmpeg -i “$i.mp4” -vf “transpose=1” -c:a copy “rotated_$i.mp4”; done
“`
预期输出结果:
“`
rotated_1.mp4
rotated_2.mp4
rotated_3.mp4
rotated_4.mp4
rotated_5.mp4
“`
虽然小编不是太懂,这一眼看过去,显然不够快速,不快的原因是,会对视频重新进行编码。
凭着对FFMPEG的一点点了解,结合平时我对单个视频的操作所使用的代码是
ffmpeg -display_rotation:0 90 -i input.mp4 -c copy output.mp4
借鉴其方案决定对其微调一下,将多个视频文件名列出一个清单list.txt,然后结合base,执行ffmpeg里的-display_rotation元数据旋转
@echo off setlocal enabledelayedexpansion
echo 使用270度旋转方案… echo.
for /f “usebackq delims=” %%i in (“list.txt”) do ( set “input=%%i” set “output=rotated_%%i”
)
echo 270度旋转完成! pause
显然结果不出小编所料,成了。
写在最后的话视频能完成旋转前提是,电脑安装了FFMPEG。
未经允许不得转载:哈哈软件 » 如何对电影视频进行横竖屏批量转换