5

目录包含 2 个(或更多)具有任何随机名称的视频文件。

video1.mkv
video2.mkv

需要找出每个视频的持续时间。为此,我们使用MediaInfo

setlocal EnableDelayedExpansion

for %%a in (*.mkv) do (
  for /f "usebackq" %%a in (`"mediainfo --Inform=Video;%%Duration%% %%a"`) do set duration=%%a

  echo "!duration!" > "data.txt"
)

问题是,它只打印 1 个值/持续时间(我认为是最后一个文件)。它有效,只为一个文件购买。

如何使其适用于目录中存在的所有文件?

4

3 回答 3

3

只需使用>>而不是>,它追加而不是覆盖

setlocal EnableDelayedExpansion

for %%a in (*.mkv) do (
  for /f "usebackq" %%a in (`"mediainfo --Inform=Video;%%Duration%% %%a"`) do set duration=%%a

  echo "!duration!" >> "data.txt"
)
于 2017-06-10T13:29:02.847 回答
1

如果 mediainfo.exe 位于路径中的某个位置,则不需要引用此名称,但由于.mkv文件名很可能包含空格,请按如下方式更改引用:

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
( For %%a in (*.mkv) do (
    Set "Duration="
    For /f "delims=" %%b in (
      'mediainfo --Inform^=Video^;%%Duration%% "%%a"'
    ) do set "Duration=%%b"
    echo !Duration!,"%%a"
  )
) > "data.txt"

在不知道它属于哪个文件的情况下拥有持续时间并没有多大用处,因此这个使用 *.mpg 文件运行的示例附加了文件名。

2595000,"R:\video\Der Traum ihres Lebens - Das Erste 2010-07-09 20-15-00.mpg"
5333160,"R:\video\Dirty Harry 3 - Der Unerbittliche - RTL2 2010-05-29 00-10-00.mpg"
5651960,"R:\video\Die Spur des Falken - Das Erste 2010-05-28 00-40-00.mpg"
于 2017-06-10T15:02:44.957 回答
0

只要 MediaInfo 在 %Path% 中,我一直这样做的方式是使用临时文本文件。

for %%a in (*.mkv) do set mkv=%%a&& call :one

goto eof

:one
mediainfo "--Inform=General;%%Duration%%" "%mkv%" >> filetemp.txt

set /p dur= < filetemp.txt

echo %dur%
pause
del filetemp.txt
:eof

我使用它的一个变体来使用 ffmpeg 对我的电视节目进行编码,使用 MediaInfo 来获取我在一周内录制的 1-15 个节目的持续时间、帧速率和帧高度。

于 2018-12-16T16:23:32.543 回答