【问题标题】:Split into equal parts and convert many mp4 videos using ffmpeg分割成相等的部分并使用 ffmpeg 转换许多 mp4 视频
【发布时间】:2015-12-03 07:31:04
【问题描述】:

我有大量视频需要使用 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

根据阅读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

非常感谢您的帮助!

【问题讨论】:

  • 我认为标签 :Beginning 不能在 () 中使用,请将其放在 FOR %%A look at the bugs section 之前。还要在ffmpeg 命令前面使用echo 测试您的批处理。 goto :Beginning 中似乎有无限循环,因为没有 IF 语句
  • 呵呵,我的编码技能可能是陪审团操纵的。该声明是由 10 个不同的网页串在一起的。我会试试你说的,但我有一种感觉,我无法让它发挥作用,哈哈

标签: batch-file ffmpeg


【解决方案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

此示例不会重命名名称中带有 ! 的文件,因为我不想使代码过于复杂以解决此问题。

【讨论】:

  • 哇,太棒了,非常感谢:) 我相信你花了两秒钟,哈哈。它工作得几乎完美,但我尝试了一个产生 12 个片段的长文件,并将它们命名为完美,直到它到达:-1-00-00 -1-10-10 然后它跳到:-1-60-60 - 1-70-70 等。我正在尝试修复它,但也许在名称后放置一个带有 10、20 等的计数器会更容易。我只需要知道我观看了哪些文件,所以任何顺序都是好的.我会试着弄清楚,但你把最难的部分搞定了。再次感谢! :)
  • 很好的批处理,刚刚尝试解复用一个小mp4,它工作顺利。 %ffmpeg% -i "%%a" ^ -f segment -segment_time 1:00 -segment_list tmp.csv -reset_timestamps 1 ^ -codec copy -c:v copy -c:a copy -flags +global_header converted\tmp%%03d.mp4 谢谢。
  • @bobafetta,有一个错字和错误的公式来计算 1 小时后的分钟数。
  • 你是最棒的!我无法告诉你我多么感谢你的帮助:D
猜你喜欢
  • 2017-05-25
  • 2016-01-04
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
相关资源
最近更新 更多