Поиск совпадений файлов и назначение переменных с помощью скрипта .BAT - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь присвоить файл переменной в , а затем также назначить еще 2 файла в переменную anoter.

Однако у меня возникла проблема.

Из исследования я обнаружил, как я могу выполнить назначение, но кто-нибудь знает, как я могу сделать следующее.

Из папки или текстового файла (любой вариант) найдите .m2v видеофайл и присвойте его Var1, затем найдите соответствующий звук в .wav и поместите его в Var2, а третий - это также .wav с именем mathcing и присвойте его Var3.

Проблема, с которой я столкнулся при попытке найти соответствующие 2 аудиофайлы для видео.

Видеофайл имеет имя:

PAV_PRG_13683Highc450277201906251802090353.m2v

Аудио 1:

PAV_PRG_13683High01c450211201906251802090376.wav

Аудио 2 - это:

PAV_PRG_13683High00c450211201906251802090368.wav

Имя файла совпадает, пока не увидит слово High. Все, что после High, не нужно (это просто случайная строка), поэтому попытка сопоставления является проблемой.

Есть ли способ найти совпадение, сравнив все до High.

Кроме того, так как я буду использовать переменную и вводить их через для объединения, есть ли способ сделать это так, чтобы после выполнения команды ffmpeg она переместилась к следующим соответствующим файлами назначает их переменной.

Файлы хранятся в папках 2, одна папка содержит все видеофайлы *.m2v, а другая папка содержит все *.wav аудиофайлы в парах 2,Каждое видео содержит ровно 2 аудиозаписей, (слева направо).

Есть ли какая-нибудь помощь по этому вопросу, я уже пустился в своем исследовании и проверял это в течение последней недели, потраченной почти 30ч.

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Логика («Псевдокод»):

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!
)
1 голос
/ 02 октября 2019

Я определил, какие файлы являются левым и правым аудиоканалами.

Файлы с 00 после «High» - это ЛЕВЫЙ аудио. Файлы с «01» после «High» - это 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

ТАКЖЕПодчеркивание всегда будет присутствовать? Как насчет PAV и PRG?

Я подозреваю, что единственным значением, которое каждый файл определяет уникально для каждой пары движение / аудио, является либо уникальное значение, либо 13683,13683High или 13683Highc.

IE. Я полагаю, что каждый файл будет иметь префикс PAV_PRG_, что делает это значение необязательным для сопоставления и позволяет процессу работать намного проще. Непонятно, одинаковы ли «High» или «Highc» во всех файлах,но если префикс действительно не нужен, это будет легко в любом случае.

Тем не менее, сейчас я предположу, что High неуникально, поэтому все файлы имеют "High" на данный момент

Тем не менее, я могу определить правильный левый и правый аудиоканалы.

Я заметил, что пространство между High и c явно имеет 00 и 01 в аудиофайлах, AudioКаналы обычно освещают канал 0 = левый канал, канал 1 = правый канал (независимо от того, был ли источник стереофоническим, 2.1 или 5.1.)

При обработке звуковых дорожек Программное обеспечение будет следовать этому стандартному методу обращения к каналам. и должен выводить в файлы со значением 00, указывающим первый аудиоканал (слева), 01, указывающим второй аудиоканал (справа), если не было предпринято каких-либо действий для изменения этого поведения. r.

В соответствии с вышеприведенным предположением, это может быть необходимо.

Обратите внимание, что вам нужно будет отредактировать скрипт, чтобы в заданных переменных были заданы правильные пути.

...