「已解决」调用ffmpeg让视频无损旋转的批处理代码错在哪?

不懂编程,仅能看懂HTML4.0以前的代码,以及部分简单的js脚本。

我在Google上找了两个多小时,想在原有的批处理代码上做一个基于ffmpeg,让视频按需要设置旋转方向,并无损旋转后,保存在源路径的文件。错误的代码如下

@echo off & title
title 视频顺逆转90°
echo. -vf "transpose=1"会重编码;-vf hflip水平镜像;-vf vflip垂直镜像。-vf "transpose=1,transpose=1"顺转180;-vf rotate=PI/4顺转45°。
echo. ffmpeg -i %video% -metadata:s:v rotate="0" -c:v copy -c:a copy output.mp4去Rotation属性0;90;180;270;ffmpeg -i output.mp4 -vf "transpose=2" out.mp4逆转90°
set /p video=请将【视频】文件拖拽到此处,按下回车确认:
echo. set /p roll=0逆转90°再垂直翻转;1顺转90°;2逆转90°;3顺转90°再水平翻转。按下回车确认:
ffmpeg.exe -i %video%  -c copy -metadata:s:v:0 rotate=90 -codec copy G:\output.mp4
echo.
echo 合并结束!
echo 文件已经输出到本地的 G:\output.mp4。
pause

我多次尝试,屏蔽了roll这个变量,-vf “transpose=1” 报错。-vf transpose=1 报错。-metadata:s:v rotate=“0” -c:v copy -c:a copy 不报错顺利执行,但没有任何效果。

甚至都怀疑找到的参数和范例都是错的。

我只想利用这个批处理框架,把正确的命令写进去,根据提示把单个或多个视频丢进批处理,能自动识别视频文件格式按照提示输入旋转方向参数 无 损 旋 转 ,回车直行,将输出文件名加个 _roll 的尾缀,并保持输入文件的视频扩展名和路径即可

不知道这种要求用批处理和ffmpeg框架能否实现,如果可以,能否告之我上述代码错在哪里,或应该如何写才对?

最后先感谢各位的回答!

下列内容配合正确答案才能有效!用ffmpeg github上的打包资源 5.x 6.x 7.x批处理可运行但无效!
用最新losslesscut中 378 KB (387,584 字节) 没有版本号的ffmpeg.exe试了下。把代码中的旋转0改成360°,就可以逆转90°了。肯能因为视频里带着 Rotation : 90°的属性,可以用mediainfo查看到。所以需要在顺转基础上-90的补正就行了,也就是说设置为旋转360°其实是360-90=270°,因为批处理中没有命令清理掉这个Rotation参数的值。

下面是我之前写的无损旋转,如果要无损肯定不能重编码啊

@echo off
if [%1]==[] (
echo ===================================================================
  echo.
  echo.
  echo 操作错误,请直接把视频拖到图标上,不要先打开此程序
  pause>>nul
  goto:EOF
)
pushd "%~dp0"
set ffmpeg=bin\ffmpeg.exe

:Start
"%ffmpeg%" -i "%~1"  -metadata:s:v:0 rotate=90 -c:v copy -c:a copy "%~dpn1_r90°.mov"

shift /1
IF [%1]==[] (GOTO :End) ELSE (GOTO :Start)

:End
popd
cls
  echo.
  echo.
echo ===================================================================
echo 无损批量旋转已完成,按任意键退出
pause>>nul

你都放滤镜上去了还想无损。。。这可能吗

你p图完了还想不保存吗(

@echo off
setlocal enabledelayedexpansion

:: 定义旋转角度的映射关系
set "rotation_angle="
set "rotation_message="

:input_rotation
echo 请输入旋转方向参数:
echo 1. 90度顺时针旋转
echo 2. 90度逆时针旋转
echo 3. 180度旋转
echo 4. 不旋转
set /p "rotation_choice=请选择(1-4): "

if "%rotation_choice%"=="1" (
    set "rotation_angle=90"
    set "rotation_message=顺时针90度旋转"
) else if "%rotation_choice%"=="2" (
    set "rotation_angle=270"
    set "rotation_message=逆时针90度旋转"
) else if "%rotation_choice%"=="3" (
    set "rotation_angle=180"
    set "rotation_message=180度旋转"
) else if "%rotation_choice%"=="4" (
    set "rotation_angle=0"
    set "rotation_message=不旋转"
) else (
    echo 无效的选择,请重新输入
    goto input_rotation
)

:: 处理所有输入的视频文件
for %%f in (%*) do (
    set "input_file=%%~f"
    set "output_file=%%~dpnf_roll%%~xf"

    echo 正在对 "%%~nf%%~xf" 进行 %rotation_message%...

    if "%rotation_angle%"=="0" (
        echo 你选择了不旋转,直接复制文件。
        copy "%%~f" "%output_file%"
    ) else (
        ffmpeg -i "%%~f" -c copy -metadata:s:v:0 rotate=%rotation_angle% "!output_file!" -hide_banner
    )

    if !errorlevel! == 0 (
        echo 处理完成: "!output_file!"
    ) else (
        echo 处理 "%%~nf%%~xf" 时出现错误
    )
)

echo 所有文件已处理完成。
pause

ffmpeg.exe、视频文件、脚本文件,在同一目录下。
将视频文件拖到脚本上打开,随意选一个,完成。

但,为什么没有旋转呢?

您好,代码测试了,能正常运行,结果出来与我自己做的某一版一致,文件大小从74.7m变为74.8m。但PotPlayer默认不旋转的模式下,播放结果二者一致。
该视频是三星s20拍摄。mediainfo查看源文件如图。
原始文件mediainfo信息

批处理只修改了两处:
11行 set ffmpeg=E:\Program Files\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe

14行 %~dpn1_r90°.mp4原为%~dpn1_r90°.mov

您好,这第二个脚本能测试通过,功能完全贴合。只是出来视频的结果与原视频完全一致。
这个视频,我用losslesscut试过是可以正常旋转的。

早前,我在 环境变量-系统变量-变量 path-值 增加了 E:\Program Files\ffmpeg-master-latest-win64-gpl\bin。其它自己写的bat文件也可以正常运行并作用。

我就不明白到底是不是参数对视频编码内容支持不好还是什么其它原因,为此,我还在发问题前在github上更新ffmpeg到最新版本了。

提两个思路:

  1. 换多个播放器试试,确定旋转真的没有发生,而不是 PotPlayer 设置的问题
  2. 如果不一定要用 ffmpeg 的话,对某些格式(起码 mp4 可以),exiftool 可以方便地无损旋转,原理是编辑视频的元数据。

首先感谢新思路和软件的推荐。
我下了个看了下,一打开命令行,还需要学习成本,直接被劝退了,功能是很强大。不是不愿意学习,本来对代码小修小改就已经吃力,还全英文,常用命令还得专门建个文本文档保存还要注释。。。毕竟不是天天用,且效率也不见得高过losslesscut多少。残念了。

确定了,是 ffmpeg 的版本问题,最新版旋转不了,老一点的版本可以,但旋转的方向有点问题。

新、旧,指的是那个具体版本?ffmpeg恨不得一分钟出3个版本,我试了2页的 7.0 win64-lgpl 这个代号的都不行,又试了最新版里 ffmpeg-n6.1-latest-win64-lgpl-6.1 导出仍然不旋转。

@48vows 我给你修改了帖子,因为你的原始帖子自动被论坛识别成了数学公式,有角标啥的奇怪玩意,所以给你改成了代码的样式

新版是用的 ffmpeg-7.0.1-essentials_build。

旧版用的 LosslessCut(老版本) 中复制出来的一个。
旋转的方向有点问题,可能要改一下脚本,你可以试试,我试了 3. 180度旋转,结果是90度旋转。

旋转处理使用滤镜,肯定是要重新编码的,不能使用 c:v copy, 只要重新编码必然会有损

我用最新losslesscut中 378 KB (387,584 字节) 没有版本号的ffmpeg.exe试了下。把代码中的旋转0改成360°,就可以逆转90°了。肯能因为视频里带着 Rotation : 90°的属性,可以用mediainfo查看到。所以需要在顺转基础上-90的补正就行了,也就是说设置为旋转360°其实是360-90=270°,因为批处理中没有命令清理掉这个Rotation参数的值。

这种问题不是直接喂给ai就能出结果的吗
代码就算了,现在谁还自己写命令行脚本啊

大小变化是因为添加了旋转标签,这个旋转标签得播放器认。一般都是认的