【问题标题】:Finding File Matches & Variable Assignment using a .BAT Script使用 .BAT 脚本查找文件匹配和变量分配
【发布时间】:2020-01-31 15:00:27
【问题描述】:

我正在尝试将一个文件分配给 中的一个变量,然后还将另外 2 个文件分配给另一个变量。

但是,我遇到了问题。

从研究中,我发现了我可以如何分配,但有人知道我可以如何进行以下操作。

从文件夹或文本文件(都可以),找到.m2v视频文件并将其分配给Var1,然后在.wav中找到匹配的音频并将其放入Var2,第三个也是带有数学名称的音频.wav 并将其分配给Var3

我遇到的问题是试图找到与视频匹配的 2 音频文件。

视频文件命名为:

PAV_PRG_13683Highc450277201906251802090353.m2v

音频 1 是:

PAV_PRG_13683High01c450211201906251802090376.wav

音频 2 是:

PAV_PRG_13683High00c450211201906251802090368.wav

文件名匹配,直到看到单词HighHigh 之后的所有内容都不需要,(它只是一个随机字符串),因此尝试匹配是一个问题。

有没有办法通过比较High之前的所有内容来找到匹配项。

此外,我将使用变量并将它们通过 进行合并,有没有办法做到这一点,以便当ffmpeg 命令完成时,它会移动到下一个匹配文件并将它们分配给变量。

文件存储在2 文件夹中,一个文件夹包含*.m2v 的所有视频文件,另一个文件夹包含*.wav 成对的所有*.wav 音频文件@。每个视频都有确切的2 音频,(左右)。

关于这个问题有什么帮助吗,我的研究已经空了,上周花了将近 30 个小时来检查这个问题。

【问题讨论】:

  • 如果High前面的部分相同,后面的部分是随机的,你怎么知道哪个文件是左声道,哪个是右声道?
  • 高匹配前的部分,我不知道是左是右,只是按原样合并。
  • 你试过什么,你卡在哪里了?请分享您的编码尝试minimal reproducible example
  • 嗨 aschipfl,我一直在使用查找字符串函数来尝试匹配字符串,问题是如果我最终使用它,它会返回所有文件,因为它具有相同的开头只是视频id 之前的 id 不同,不知道如何使那个有选择性

标签: batch-file ffmpeg windows batch-file ffmpeg


【解决方案1】:

逻辑(“伪代码”):

for each .m2v file
  create video-variable
  split by `High` and get first part
    look for corresponding .wav files
      set right- and left-variables

代码:

@echo off
setlocal enabledelayedexpansion

for %%a in (*.m2v) do (
  set "right="
  set "left="
  set "video=%%a"
  for /f "delims=|" %%b in ("!video:High=|!") do (
    for %%c in ("%%b*.wav") do (
      if not defined right (set "right=%%c") else (set "left=%%c")
    )
  )
  echo your ffmpeg command with  !video! , !right! , !left!
)

【讨论】:

  • 在这里工作正常。您在正确的文件夹中吗?有*.m2v 文件吗?
  • 啊,好吧,我发现了我的问题,是在错误的视频文件夹中,抱歉。快速提问,所以如果我在循环之后有一个 ffmpeg 命令来合并它们,那么变量是否会移动到下一组视频/音频?
  • 等一下,抱歉,第二个文件是错误的音频。结果 > PAV_PRG_13717Highc450277201906251813110160.m2v , PAV_PRG_13683High00c450277201906251802090368.wav , PAV_PRG_13717High01c45027720190625181311019.
  • 查看我编辑的代码,了解在哪里插入您的 ffmpeg 命令。更改后的代码还应防止提供错误的音频文件。
【解决方案2】:

我确定了哪些文件是左右声道。

“高”后带有 00 的文件是 LEFT 音频。 “High”后有01的文件为RIGHT Audio。

请编辑以下内容以获得正确的路径,并根据自己的喜好编辑 FFMPeg 命令。

我不熟悉 FFMPeg,只是花了几个小时试图弄清楚如何合并视频和音频,所以它可能不正确。

编辑:

@(SetLocal EnableDelayedExpansion
  ECHO OFF
  SET "_Src_Path_M2v=C:\Users\Username\Documents\VideoFiles"
  SET "_Src_Path_Wav=C:\Users\Username\Documents\AudioFiles"
  SET "_Dst_Path=C:\Users\Username\Documents\MergedFiles"
  SET "_Dst_Ext=.Mxf"
  SET "_CMD_FFMpeg=C:\Path\to\FFMPEG\ffmpeg.exe"
  SET "_CMD_FFMpeg_Options= -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000 "
  REM -i video.m2v -i right.wav -i left.wav -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000 !video!.mxf 
)

CALL :Main

( ENDLOCAL
  EXIT /B
)

:Main
  IF NOT EXIST "%_Dst_Path%\" MD "%_Dst_Path%\"
  REM Loop the M2v Folder Matching the Number after PAV_PRG_
  FOR %%_ IN (
    "%_Src_Path_M2v%\*.m2v"
  ) DO (
    ECHO.
    ECHO.===================================
    FOR /F "Tokens=1 Delims=c" %%A IN (
      "%%~n_"
    ) DO (
      SET "_Temp_Output=%%A"
      ECHO.Unique Sequence = "%%A", so Audio must start with "%%A"
      REM Find Left Audio (File 1)
      FOR %%a IN ("%_Src_Path_Wav%\%%A00*.wav"
        ) DO ( SET "_Temp_Audio_00=%%~fa" )
     REM Find Right Audio (File 2)
      FOR %%a IN ("%_Src_Path_Wav%\%%A01*.wav"
        ) DO ( SET "_Temp_Audio_01=%%~fa" )
    )
    REM We now have all of the values we need.
    REM "%%_" holds the path of the M2v file.
    REM _Temp_Audio_ "00" and "01" hold the full paths to the audio files.
    REM Now we Output what we have found and run FFMPEG
    ECHO.
    ECHO.* *** M2v File: - %%~f_
    ECHO. *  Left Audio: - !_Temp_Audio_00!
    ECHO. * Right Audio: - !_Temp_Audio_01!

    REM Set the command to a temp variable so we can echo it then execute it.
    REM                                 -i video.m2v   -i right.wav            -i left.wav           -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000 !video!.mxf 
    SET "_Temp_Full_Cmd="%_CMD_FFMpeg%" -i "%%~f_"     -i "!_Temp_Audio_01!"   -i "!_Temp_Audio_00!" %_CMD_FFMpeg_Options% "%_Dst_Path%\!_Temp_Output!_Result%_Dst_Ext%""

    ECHO. *  Running: !_Temp_Full_Cmd!
    !_Temp_Full_Cmd!

  )
GOTO :EOF

上一页

@(SetLocal EnableDelayedExpansion
  ECHO OFF
  SET "_Src_Path_M2v=C:\Users\Username\Documents\VideoFiles"
  SET "_Src_Path_Wav=C:\Users\Username\Documents\AudioFiles"
  SET "_Dst_Path=C:\Users\Username\Documents\MergedFiles"
  SET "_Dst_Ext=.Mxf"
  SET "_CMD_FFMpeg=C:\Path\to\FFMPEG\ffmpeg.exe"
  SET "_CMD_FFMpeg_Options= -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000 "
  REM -i video.m2v -i right.wav -i left.wav -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000 !video!.mxf 
)

CALL :Main

( ENDLOCAL
  EXIT /B
)

:Main
  IF NOT EXIST "%_Dst_Path%\" MD "%_Dst_Path%\"
  REM Loop the M2v Folder Matching the Number after PAV_PRG_
  FOR %%_ IN (
    "%_Src_Path_M2v%\*.m2v"
  ) DO (
    ECHO.
    ECHO.===================================
    FOR /F "Tokens=1-4 Delims=_Hc" %%A IN (
      "%%~n_"
    ) DO (
      SET "_Temp_Output=%%A_%%B_%%CH%%D"
      ECHO.Unique Sequence = "%%C", so Audio must start with "%%A_%%B_%%CH%%D"
      REM Find Left Audio (File 1)
      FOR %%a IN ("%_Src_Path_Wav%\%%A_%%B_%%CH%%D00*.wav"
        ) DO ( SET "_Temp_Audio_00=%%~fa" )
     REM Find Right Audio (File 2)
      FOR %%a IN ("%_Src_Path_Wav%\%%A_%%B_%%CH%%D01*.wav"
        ) DO ( SET "_Temp_Audio_01=%%~fa" )
    )
    REM We now have all of the values we need.
    REM "%%_" holds the path of the M2v file.
    REM _Temp_Audio_ "00" and "01" hold the full paths to the audio files.
    REM Now we Output what we have found and run FFMPEG
    ECHO.
    ECHO.* *** M2v File: - %%~f_
    ECHO. *  Left Audio: - !_Temp_Audio_00!
    ECHO. * Right Audio: - !_Temp_Audio_01!

    REM Set the command to a temp variable so we can echo it then execute it.
    REM                                 -i video.m2v   -i right.wav            -i left.wav           -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000 !video!.mxf 
    SET "_Temp_Full_Cmd="%_CMD_FFMpeg%" -i "%%~f_"     -i "!_Temp_Audio_01!"   -i "!_Temp_Audio_00!" %_CMD_FFMpeg_Options% "%_Dst_Path%\!_Temp_Output!_Result%_Dst_Ext%""

    ECHO. *  Running: !_Temp_Full_Cmd!
    !_Temp_Full_Cmd!

  )
GOTO :EOF

示例输出:

C:\Admin>C:\Admin\SO_FFMPEG_v3.1.cmd

===================================
Unique Sequence = "13683", so Audio must start with "PAV_PRG_13683High"

* *** M2v File: - C:\Users\Username\Documents\VideoFiles\PAV_PRG_13683Highc450277201906251802090353.m2v
 *  Left Audio: - C:\Users\Username\Documents\AudioFiles\PAV_PRG_13683High00c450277201906251802090777.wav
 * Right Audio: - C:\Users\Username\Documents\AudioFiles\PAV_PRG_13683High01c450277201906251802090368.wav
 *  Running: "C:\Path\to\FFMPEG\ffmpeg.exe" -i "C:\Users\Username\Documents\VideoFiles\PAV_PRG_13683Highc450277201906251802090353.m2v"     -i "C:\Users\Username\Documents\AudioFiles\PAV_PRG_13683High01c450277201906251802090368.wav"   -i "C:\Users\Username\Documents\AudioFiles\PAV_PRG_13683High00c450277201906251802090777.wav"  -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000  "C:\Users\Username\Documents\MergedFiles\PAV_PRG_13683High_Result.Mxf"

===================================
Unique Sequence = "13686", so Audio must start with "PAV_PRG_13686High"

* *** M2v File: - C:\Users\Username\Documents\VideoFiles\PAV_PRG_13686Highc450277201906251803430188.m2v
 *  Left Audio: - C:\Users\Username\Documents\AudioFiles\PAV_PRG_13683High00c450277201906251802090777.wav
 * Right Audio: - C:\Users\Username\Documents\AudioFiles\PAV_PRG_13683High01c450277201906251802090368.wav
 *  Running: "C:\Path\to\FFMPEG\ffmpeg.exe" -i "C:\Users\Username\Documents\VideoFiles\PAV_PRG_13686Highc450277201906251803430188.m2v"     -i "C:\Users\Username\Documents\AudioFiles\PAV_PRG_13683High01c450277201906251802090368.wav"   -i "C:\Users\Username\Documents\AudioFiles\PAV_PRG_13683High00c450277201906251802090777.wav"  -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000  "C:\Users\Username\Documents\MergedFiles\PAV_PRG_13686High_Result.Mxf"

===================================
Unique Sequence = "13717", so Audio must start with "PAV_PRG_13717High"

* *** M2v File: - C:\Users\Username\Documents\VideoFiles\PAV_PRG_13717Highc450277201906251813110160.m2v
 *  Left Audio: - C:\Users\Username\Documents\AudioFiles\PAV_PRG_13717High00c450277201906251813110333.wav
 * Right Audio: - C:\Users\Username\Documents\AudioFiles\PAV_PRG_13717High01c450277201906251813110194.wav
 *  Running: "C:\Path\to\FFMPEG\ffmpeg.exe" -i "C:\Users\Username\Documents\VideoFiles\PAV_PRG_13717Highc450277201906251813110160.m2v"     -i "C:\Users\Username\Documents\AudioFiles\PAV_PRG_13717High01c450277201906251813110194.wav"   -i "C:\Users\Username\Documents\AudioFiles\PAV_PRG_13717High00c450277201906251813110333.wav"  -map 0:0 -vcodec mpeg2video -s 1920x1080 -b:v 50000k -maxrate 50000k -bufsize 3835k -minrate 50000k -r 25 -flags ilme -top 1 -acodec pcm_s24le -ar 48000 -pix_fmt yuv422p -map 1:0 -c:a pcm_s24le -ar 48000 -map 2:0 -c:a pcm_s24le -ar 48000  "C:\Users\Username\Documents\MergedFiles\PAV_PRG_13717High_Result.Mxf"

C:\Admin>

我相信这是合并两个单声道音频流并将所有三个音频流合并到一个输出文件中的正确语法。

我只是在 FFMPeg 中潜心研究如何做到这一点的时间比我预期的要长得多,而且您很可能希望做一些更复杂的事情,所以无论如何,请随时用您自己的来替换。 :)

我认为与原始帖子不再相关的注释:

文件名匹配,直到它看到单词 High。不需要 High 之后的所有内容(它只是一个随机字符串),因此尝试匹配是一个问题。

我觉得有点不清楚:

是所有文件都有“Highc”还是“Highc”对每个视频都是唯一的?

或者“High”对于每个视频来说都是唯一的,而“c”以及之后的所有内容都可以被忽略?

IE:你只需要找PAV_PRG_13683还是PAV_PRG_13683High还是PAV_PRG_13683Highc

ALSO 下划线是否总是存在? PAVPRG 呢?

我怀疑每个文件为每个移动/音频对唯一定义的唯一值是 1368313683High13683Highc

IE。我相信每个文件都将以 PAV_PRG_" 为前缀,这使得该值不必匹配,并允许该过程更简单地工作。不清楚 "High" 或 "Highc" 在所有文件上是否也相同,但如果确实不需要前缀,那么无论哪种方式都很容易。

不过,现在我会假设 High 是非唯一的,所以现在所有文件都有“High”

也就是说,我能够确定正确的左右声道。

我注意到High和c之间的空间在音频文件上显然有一个00和01,音频通道通常是通道0 =左通道,通道1 =右通道。 (源是立体声、2.1 还是 5.1。)

在处理音轨时,软件将遵循此引用通道的默认方法,并应输出到文件,其中 00 表示第一个音频通道(左),01 表示第二个音频通道(右),除非采取了一些行动来改变这种行为。

根据上述假设,这将是必要的。

请注意,您需要编辑脚本以在提供的变量中设置正确的路径。

【讨论】:

  • @APerson 我对其进行了编辑以使其更加清晰,因为我确定了哪些是正确的左右 Adio,但我不确定我的 FFMPEg 命令是否正确(花了在查看合并文件的方法时——当我开始写这篇文章时,这里甚至没有其他答案。)。
  • @APerson 好的,谢谢,我的代码假定所有文件都以PAV_PRG_[Unique_ID]High 开头,视频文件后跟c[garbage_numbers].m2v,而音频文件以[Channel_ID]c[garbage_numbers].wav 结尾,其中频道ID 为@987654338 @ 代表左,01 代表右。我很想知道正确的 FFMPeg 命令来创建带有视频、左音频和右音频通道的输出文件,因为我不得不尝试将它们组合在一起。
  • @APerson 很抱歉让我等了很久才回复,我不得不出去照顾孩子们。问题是我不小心使用了UseBackq 关键字,就好像我想解析文件一样,但我不想解析字符串。删除它修复了它。但我也注意到我可以通过停止不必要的回声来整理一下。发布修改和示例结果。 :)
  • 你区传奇,谢谢
  • @APerson 很高兴为您提供帮助!我看到你已经选择了另一个答案作为解决方案,所以我想它也对你有用,但很高兴我的解决方案最终能更好地解决问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多