我有大量视频需要使用 ffmpeg 将 mp4 转换为 wmv,并将每个文件分成 10 分钟的片段,但我是一个 cmd 脚本新手(事实上,我是一个脚本新手:)
在花了六个小时试图找到答案之后,我想我会把它带给你们。
我的代码可以运行一点,但我需要能够读取来自命令行的数据并将其发送回脚本进行评估。我不确定 ffmpeg 在处理完视频文件后(当时间戳到达结束时)会吐出什么代码,但这个 FOR 循环只是继续尝试创建新的文件段,即使视频已经结束。这是我在尝试创建新文件时看到的内容,所以我认为搜索它可能会起作用:
帧= 0 fps=0.0 q=0.0 Lsize= 1kB 时间=00:00:00.00 比特率=N/A
这是我到目前为止想出的代码(不要笑:)
@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION
for %%a in ("*.mp4") do (
set hour=00
for /L %%i IN (1,1,10) do (
:Beginning
set /a start=%%i-1
set end=%%i
if !start! lss 10 set start=!start!0
if !end! lss 10 set end=!end!0
ffmpeg -ss !hour!:!start!:00 -i "%%a" -b:v 1500k -vcodec msmpeg4 -acodec wmav2 -t !hour!:!end!:00 "Converted\%%~na-!hour!-!start!-!end!.wmv"
if end==60 CALL :Increment
)
)
:Increment
set /a !hour!+1
set %%i=1
GOTO :Beginning
pause
基于阅读这个线程 https://stackoverflow.com/questions/357315/get-list-of-passed-arguments-in-windows-batch-script-bat正在考虑代码中可能会出现这样的内容,但不确定如何处理它:
set "dosstring=%*"
echo.!dosstring!|findstr /C:"frame= 0 fps=0.0 q=0.0 Lsize= 1kB time=00:00:00.00 bitrate=N/A" >nul 2>&1
非常感谢您的帮助!
更有效的方法是调用ffmpeg
每个文件只需一次并使用其分段 http://www.ffmpeg.org/ffmpeg-formats.html#Examples-5特征。
这些段将按顺序编号,因此如果您绝对需要在名称中包含时间戳,我们还将生成 CSV 格式的段时间戳列表:
tmp000.wmv,0.000000,60.281000
tmp001.wmv,60.281000,120.041000
然后解析它并重命名这些段。
@echo off
for %%a in (*.mp4) do (
ffmpeg -i "%%a" ^
-f segment -segment_time 10:00 -segment_list tmp.csv -reset_timestamps 1 ^
-b:v 1500k -vcodec msmpeg4 -acodec wmav2 converted\tmp%%03d.wmv
setlocal enableDelayedExpansion
for /f "delims=, tokens=1-3" %%b in (tmp.csv) do (
set sec=%%c & set sec=!sec:.*=!
set /a hour="sec / 3600"
set /a mins1="sec / 60 %% 60" & set mins1=0!mins1!
set sec=%%d & set sec=!sec:.*=!
set /a mins2="sec / 60 %% 60" & set mins2=0!mins2!
ren "converted\%%b" "%%~na-!hour!-!mins1:~-2!-!mins2:~-2!.*"
)
endlocal
del tmp.csv
)
pause
此示例不会使用以下命令重命名文件!
在名称中,因为我不想使代码过于复杂来解决这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)