分成相等的部分并使用ffmpeg转换许多mp4视频

时间:2015-09-07 17:47:50

标签: batch-file ffmpeg

我需要使用ffmpeg将大量视频从mp4转换为wmv并将每个文件分解为10分钟段,但我是一个完整的cmd脚本newb(事实上,我是一个脚本新手:)

在花了六个小时试图找到答案后,我想我会把它带给你们。

我的代码工作有点,但我需要能够读取来自命令行的数据并将其发送回脚本以进行评估。我不确定当处理视频文件时(当时间戳到达结束时)ffmpeg会吐出什么代码,但是这个FOR循环只是继续尝试创建新的文件段,即使视频结束了。这是我在尝试创建新文件时看到的,所以我认为可能会搜索到这个:

frame = 0 fps = 0.0 q = 0.0 Lsize = 1kB time = 00:00:00.00 bitrate = 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

基于阅读this thread认为这样的事情可能会出现在代码中,但不知道如何处理它:

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

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

更有效的方法是每个文件只调用一次ffmpeg并使用其segmenting功能。

段将按顺序编号,因此如果您绝对需要在名称中包含时间戳,我们还将生成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

此示例不会重命名名称中包含!的文件,因为我不想过度复杂化代码以解决此问题。