【问题标题】:Addition of output file for renaming video batch添加用于重命名视频批次的输出文件
【发布时间】:2013-01-11 05:52:47
【问题描述】:

感谢 David Ruhmann,昨天我的批处理文件正在用于重命名视频:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

:: Create Empty Folder
rd /Q "%Temp%\Temp" 2>nul & mkdir "%Temp%\Temp"

:: Loop through Folders
pushd "xPath=c:\processing"
for /d %%D in (*) do call :Process "%%~fD"
popd
goto End


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Process <Parent>
:: Folder Name
set "xFolder=%~nx1"

:: Set Sub Folder
if not exist "%~1\VIDEO\" goto :eof
pushd "%~1\VIDEO"

:: Loop through Videos
for /f "delims=" %%A in ('dir *.avi /b') do if exist "%%~fA" (
    set "xDateWritten=%%~tA"
    set "xDateGMT=0000/00/00 00:00:00"
    for /f "tokens=1,2" %%X in ('robocopy . "%Temp%\Temp" "%%~nxA" /TS /FP /NS /NC /NP /NJH /NJS /NDL /L') do set "xDateGMT=%%X %%Y"
    rem Format = FF-FF-YYYYMMDD-HHh-MMm-SSs-FF-FF.ext
    echo %xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA
    ren "%%~fA" "%xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA"
)
popd
goto :eof


:End
endlocal
pause

但现在我需要添加一个附加功能。重命名发生后,我希望脚本导出 新文件名,然后是 以字节为单位的文件大小,以及 视频的长度到 csv 或其他与 excel 兼容的文件类型。由于这些是视频文件,如果我也可以导出 帧率总帧数,那就太好了。不确定这是否甚至在批处理文件的范围内。

【问题讨论】:

  • 是否有您希望大小、长度、帧速率和帧数采用的特定格式?示例:长度 = 00h00m00s00ms 或 00:00:00:00
  • size = bytes xxx,xxx,xxx length = hh:mm:ss framerate = xx max frames = xxxxx 编辑:从技术上讲,如果我们拉帧,我们不需要持续时间,它是仅在需要时用于计算最大帧数。

标签: excel ms-access video batch-file frame-rate


【解决方案1】:

这是将名称和大小导出到 csv 文件的修改。

改变这个

echo %xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA
ren "%%~fA" "%xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA"

进入这个

set "xFrame=00,00000"
for /f %%X in ('exiftool -p "$Framerate,$Framecount" "%%~fA"') do set "xFrame=%%~X"
set "xSize=%%~zA"
set "xName=%xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA"
echo !xName!
ren "%%~fA" "!xName!"
echo !xName!,!xSize!,!xFrame!>>C:\RenameOutput.csv

更新:

要获取媒体文件信息,我们必须使用第 3 方工具。比如

  1. ExifTool
  2. MediaInfo
  3. FFmpeg

基于对 ExifTool 和 MediaInfo 的快速浏览,我更喜欢 MediaInfo,因为它更一致的媒体文件 Duration 输出格式。如何解析信息的示例。

for /f "tokens=2,*" %X in ('mediainfo file.avi ^| find "Duration "') do @echo %Y

更新 2:

在答案中添加了 exiftool 示例。

【讨论】:

  • 关闭,但输出的持续时间只是给我结束时间,而不是视频的实际持续时间。对于我当前使用的测试文件,视频将在上午 7:00 开始,并在上午 7:30 结束,这给了我们 30 分钟的持续时间,无论哪种方式都需要几秒钟。
  • @Shiken 啊,我明白了。所以你想要实际的长度。有两种方法可以从我脑海中浮现的信息中获取这些信息。 1.通过第三方命令行工具获取视频。 2. 长度 = 上次写入 - 创建日期(如果在原始写入后进行任何修改,则可能不准确)
  • @Shiken 1. exiftool,可能是我的首选 (sno.phy.queensu.ca/~phil/exiftool, sno.phy.queensu.ca/~phil/exiftool/TagNames/RIFF.html) 2. MediaInfo (mediainfo.sourceforge.net/en) 或 3. FFMPEG
  • 在玩弄了 exiftool 之后,代码 exiftool -csv -r -framerate -framecount %1 >> c:\processing\exifoutput.csv 给了我到目前为止我需要的信息,现在只是弄清楚如何将其与旧代码合并。
  • @Shiken 我已经添加到关于如何添加 exiftool 输出的答案中。
【解决方案2】:

这是对我们长评论流的回复。

改变这个

set "xName=%xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA"

进入这个

set "xHour=!xDateWritten:~11,2!"
if "!xDateWritten:~17,2!"=="PM" set /a "xHour+=12"
set "xName=%xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xHour!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA"

完整脚本(添加评论)

@echo off
setlocal EnableExtensions EnableDelayedExpansion

:: Create Empty Folder
rd /Q "%Temp%\Temp" 2>nul & mkdir "%Temp%\Temp"

:: Loop through Folders
pushd "xPath=c:\processing"
for /d %%D in (*) do call :Process "%%~fD"
popd
goto End


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Process <Parent>
:: Folder Name
set "xFolder=%~nx1"

:: Set Sub Folder
if not exist "%~1\VIDEO\" goto :eof
pushd "%~1\VIDEO"

:: Loop through Videos
for /f "delims=" %%A in ('dir *.avi /b') do if exist "%%~fA" (
    rem Retrieve the file time stamp
    set "xDateWritten=%%~tA"
    rem Retrieve the Seconds using RoboCopy
    set "xDateGMT=0000/00/00 00:00:00"
    for /f "tokens=1,2" %%X in ('robocopy . "%Temp%\Temp" "%%~nxA" /TS /FP /NS /NC /NP /NJH /NJS /NDL /L') do set "xDateGMT=%%X %%Y"
    rem Retrieve the Video frame information
    set "xFrame=00,00000"
    for /f %%X in ('exiftool -p "$Framerate,$Framecount" "%%~fA"') do set "xFrame=%%~X"
    rem Retrieve the file size
    set "xSize=%%~zA"
    rem Adjust to 24 hours
    set "xHour=!xDateWritten:~11,2!"
    if "!xDateWritten:~17,2!"=="PM" set /a "xHour+=12"
    rem Format = FF-FF-YYYYMMDD-HHh-MMm-SSs-FF-FF.ext
    set "xName=%xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xHour!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA"
    rem Display, Rename, and Save
    echo !xName!
    ren "%%~fA" "!xName!"
    echo !xName!,!xSize!,!xFrame!>>C:\RenameOutput.csv
)
popd
goto :eof


:End
endlocal
pause

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2018-05-30
    • 2012-12-26
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2013-10-28
    • 2014-02-26
    • 2023-03-31
    相关资源
    最近更新 更多