1

Тема: CMD/BAT: ffmpeg Замена аудиодорожки

ffmpeg -i v.mp4 -i a.aac -c:v copy -map 0:v:0 -map 1:a:0 -shortest new.mp4

Подскажите, как сделать так, чтобы не прописывать название файлов, указав только их расширение?
Чтобы вызывать одну и ту же команду в папке с разными файлами.
Также, было бы круто, если получаемый файл имел идентичное название входному видео файлу, но с постфиксом в виде даты и времени.
Спасибо!

2

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

Чтобы вызывать одну и ту же команду в папке с разными файлами.

Например?

3

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, нашел такое решение


for %%i in (*.mp4) do (
for %%a in (*.aac) do (
    ffmpeg -i %%i -i %%a -c:v copy -map 0:v:0 -map 1:a:0 -shortest %%~ni_%day%.mp4
  )
)

4

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii мой скрипт работает только при вызове из папки с исходниками, но хотелось бы добавить скрипт в контекстное меню Отправить и вызывать сценарий для выделенный файлов. Возможно ли это реализовать, не прописывая всякий раз пути?

5

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim, Вы не пользуете никакие сторонние файловые менеджеры? По приведённому скрипту совершенно непонятно, зачем Вы делаете MxN вызовов (где M — количество .mp4 файлов, а N — количество *.aac файлов). И откуда берётся переменная окружения %day%?

6

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, про MxN не понял, т.к. я скопировал скрипт с какого-то форума, и, в целом, он работает, а именно, если запустить его в папке рядом с видео и аудио файлом, аудио используется в качестве новой дорожки. Почему в виде цикла - чтобы не прописывать пути для файлов, а просто найти файл заданного типа, т.к. часто приходится выполнять одно и то же действие для новых файлов. Но мне нужно, чтобы скрипт работал не для исходников рядом со скриптом, а для выделенных в проводнике исходников (видео и аудио). Таким образом, отпадет необходимость копировать .bat к исходникам, а так же необходимость удалять из папки лишние файлы или переносить медиа для совершения операции в отдельную папку. То есть планируется добавить ссылку на .bat в меню Отправить и вызывать действие для выделенных файлов.

Переменная %day% из части кода, для добавления информации о дате к имени файла, я его не скопировал сюда.

7

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

про MxN не понял,

У Вас к каждому из .mp4 файлов клеится каждый *.aac файл. В итоге, Вы создаёте конечный файл %%~ni_%day%.mp4 столько раз, сколько есть в каталоге *.aac файлов, причём по итогу в результирующем файле окажется последний из них. Видимо, поэтому Вам приходится так извращаться:

becauseim пишет:

необходимость копировать .bat к исходникам, а так же необходимость удалять из папки лишние файлы или переносить медиа для совершения операции в отдельную папку

becauseim пишет:

я его не скопировал сюда.

Показывайте весь код.

И Вы не ответили — Вы пользуете какие-нибудь сторонние файловые менеджеры? Far Manager, Total Commander и т.п.?

8

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii пишет:

Показывайте весь код.

for %%i in (*.mov, *.mp4, *.mts) do (
  for %%a in (*.mp3,* .wav, *.aac) do (
    ffmpeg -i "%%i" -i "%%a" -c:v copy -map 0:v:0 -map 1:a:0 -shortest "%%~ni_replaced.mp4"
  )
)
alexii пишет:

создаёте конечный файл столько раз, сколько есть в каталоге *.aac файлов

да, именно поэтому я вынужден оставлять в папке поодному видео и аудио файлу, чтобы не создавать лишних файлов, и именно поэтому ищу способ без цикла,а для выделенных (двух) файлов.

alexii пишет:

Вы пользуете какие-нибудь сторонние файловые менеджеры?

есть TC, но не особо использую

9

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

вынужден оставлять в папке поодному видео и аудио файлу

А видео- и аудиофайлы у Вас имеют произвольные имена? То есть, нет привязки по именам, как например, имя-раз.mp4, имя-раз.mp3, имя-два.mp4, имя-два.aac.

( 2 * b ) || ! ( 2 * b )

10

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Rumata, имена всегда разные, если бы не так, я бы прописал полные пути и запускал скрипт из любого места.

11 (изменено: alexii, 2020-01-15 23:21:52)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim, пробуйте (на WSH):

+ открыть спойлер
Option Explicit

Dim objFSO

Dim objVideo
Dim objAudio

Dim strVideoFile
Dim strAudioFile

Dim objWshShell


If WScript.Arguments.Count = 2 Then
	With WScript.CreateObject("Scripting.FileSystemObject")
		Set objVideo = WScript.CreateObject("Scripting.Dictionary")
		Set objAudio = WScript.CreateObject("Scripting.Dictionary")
		
		With objVideo
			.CompareMode = vbTextCompare
			
			.Add "mov", "mov"
			.Add "mp4", "mp4"
			.Add "mts", "mts"
		End With
		
		With objAudio
			.CompareMode = vbTextCompare
			
			.Add "mp3", "mp3"
			.Add "wav", "wav"
			.Add "aac", "aac"
		End With
		
		If objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(0))) And _
			objAudio.Exists(.GetExtensionName(WScript.Arguments.Item(1))) Or _
			objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(1))) And _
			objAudio.Exists(.GetExtensionName(WScript.Arguments.Item(0))) Then
			
			If objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(0))) Then
				strVideoFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
				strAudioFile = .GetAbsolutePathName(WScript.Arguments.Item(1))
			Else
				strVideoFile = .GetAbsolutePathName(WScript.Arguments.Item(1))
				strAudioFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
			End If
			
			If .FileExists(strVideoFile) Then
				If .FileExists(strAudioFile) Then
					If StrComp(.GetParentFolderName(strVideoFile), .GetParentFolderName(strAudioFile), vbTextCompare) = 0 Then
						Set objWshShell = WScript.CreateObject("WScript.Shell")
						
						objWshShell.CurrentDirectory = .GetParentFolderName(strVideoFile)
						objWshShell.Run """ffmpeg.exe"" -i """ & strVideoFile & """ -i """ & strAudioFile & """ -c:v copy -map 0:v:0 -map 1:a:0 -shortest """ & .GetBaseName(strVideoFile) & "_replaced.mp4""", 1, True
						
						Set objWshShell = Nothing
					Else
						WScript.Echo "Need appear source video file [" & strVideoFile & "] near source audio file [" & strAudioFile & "]."
						WScript.Quit 5
					End If
				Else
					WScript.Echo "Can't find source audio file [" & strAudioFile & "]."
					WScript.Quit 4
				End If
			Else
				WScript.Echo "Can't find source video file [" & strVideoFile & "]."
				WScript.Quit 3
			End If
		Else
			WScript.Echo "Need one source video file (" & Join(objVideo.Keys) & ") and one source audio file (" & Join(objAudio.Keys) & ")."
			WScript.Quit 2
		End If
		
		objAudio.RemoveAll
		objVideo.RemoveAll
		
		Set objAudio = Nothing
		Set objVideo = Nothing
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source video file> <Source audio file>"
	WScript.Quit 1
End If

WScript.Quit 0

Создаёте в %UserProfile%\SendTo ярлык на данный скрипт .vbs, затем выделяете и отправляете на этот ярлык строго два файла из Вашего списка расширений.

12 (изменено: becauseim, 2020-01-16 02:50:14)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, спасибо! Работает, как задумывалось! Пока буду использовать это решение.
А для .cmd нельзя реализовать то же самое?
Я как-то натыкался на скрипт для ffmpeg, который просто кодировал видео, тот работал для выделенных файлов так же по вызову из Send to.

13

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim, а какая разница?

14

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, как минимум, интересно. А вообще, выглядят для меня более понятными (для возможности редактирования), а так же есть примерное понимание, как прикручиваются горячие клавиши посредством AHK.

15

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Так пишите сразу на AHK.

16

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev, я знаю, только как вызывать команду из командной строки с помощью AHK.

17

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Run.

18

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev, но мне нужно выполнить команду для выделенных файлов. Не имею представления ни на одном языке, как это делается. Другое дело, если это выполняет cmd-скрипт, а к нему я просто прикручиваю хоткей.

19

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Тема уже не раз обмусоливалась. Учитесь пользоваться поиском.

20

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev, спасибо! В данном контексте интересует решение, не привязанное к AHK, т.к. нужна работа из коробки, через контекстное меню.

21

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Отправлять каждый раз в SendTo мне было бы неудобно.
Я бы вписал в контекстное меню свой подпункт, который бы уже делал то, что мне необходимо.
Думаю на VBS это вполне можно сделать.

22

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, подскажете, как реализовать задуманное в cmd? Например, по шаблону конвертировать выделенные файлы в нужный формат через все тот же Send to. То есть в одной части сценария задается функция для оперирования выделенными файлами, в другой же - ключи конвертации для ffmpeg.

23

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Не знаю, может быть если не через SendTo, а проще и без предварительной подготовки: перетащите для демонстрации возможностей Windows выделенные файлы на этот пакетный файл:

@echo %*
@pause

То же вполне работает и для WSH. Не обязательно скрипт должен находиться в той же папке. Хотя, наверно, это и так известно всем. Но я предпочитаю в Far Manager Ctrl-F несколько раз нажать.

24

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

alexii, как минимум, интересно.

Возни много, толку — никакого.

Malcev пишет:

Отправлять каждый раз в SendTo мне было бы неудобно.

Я потому и спрашивал, не работает ли автор с каким-нибудь сторонним файловым менеджером. Скажем, для Far Manager'а это был бы пункт в User Menu, и вообще никакого WSH-скрипта — всё бы уложилось в Lua-шный скрипт Far Manager'а (включая все проверки, на четыре пятых из которых и состоит функционал скрипта).

Malcev пишет:

Я бы вписал в контекстное меню свой подпункт, который бы уже делал то, что мне необходимо.

И какая тут выгода по сравнению с SendTo? Я лично не вижу.

becauseim пишет:

alexii, подскажете, как реализовать задуманное в cmd?

Я не вижу никакой необходимости в том. Опишите, чем Вас не устраивает WSH-скрипт (кроме «выглядят для меня более понятными (для возможности редактирования)»).

Можно ли реализовать полностью аналогичное решение на пакетных файлах? Да, можно. Нужно? Пока не вижу никакой в том необходимости.

25

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Выгода в том, что не надо ждать появления подменю sendto и в нем  выбирать куда отправлять

26

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Можно на чистом cmd, примерно вот такая идея, частично проверил, но если есть желание, доработать легко:

@echo off
echo ".mov.mp4.mts" | findstr /c:"%~x1" >nul && (echo %1 > "%~f0.dat" & exit /b)
if not exist "%~f0.dat" (echo "" & exit /b)
setlocal
set /p i=<"%~f0.dat"
echo ".mp3.wav.aac" | findstr /c:"%~x1" >nul || goto eof
if not defined i goto eof
ffmpeg -i "%i:~0,-2%" -i "%1" -c:v copy -map 0:v:0 -map 1:a:0 -shortest "%~dpn1_replaced.mp4"
del /q "%~f0.dat"

Сначала перетаскиваем на скрипт .mp4 файл, потом .aac. Цель достигнута. При достаточном навыке делается быстро.

27 (изменено: alexii, 2020-01-17 17:47:04)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev, спасибо, Ваша мысль понятна.

kvk-2019, а если перетащить два или три файла? А если перетащить сначала аудиофайл, а потом видеофайл? А если перетащить сначала один видеофайл, а потом ещё один видеофайл? А если перетащить файл с расширением .mp или .mt?

Нет, перетаскивать надо два файла зараз (а внутри проверять, чтобы это были два файла, именно тех расширений, что нужно, и расположить их в правильном порядке [если они пришли в обратном]).

28 (изменено: kvk-2019, 2020-01-17 18:47:19)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, такое на cmd трудно реализовать, но если нужно простое и рабочее решение именно на cmd, то переложить часть алгоритма на ответственного за обработку данных - вполне обычное решение, особенно в прежние времена. Топикстартер, всё хочет на cmd, но, конечно, для таких задач требуются другие средства. И нужно учиться ими пользоваться. Но у меня почему-то сложилось, возможно и ошибочное впечатление, что как раз учиться он и не хочет. Вот и предложил из моих заготовок собрать что-то для себя приемлемое. Но, видно, ему это не надо. Кстати, и через SendTo, наверно, сработало бы, давно не занимался - не помню уже. В скрипте требуется только, чтобы полный путь в качестве аргументов приходил. Да, и прийти к решению вида

echo ".mov$.mp4$.mts$" | findstr /c:"%~x1$" >nul

хотел предложить в качестве самостоятельного достижения при отладке. Готовые решения, мне кажется, не всегда мотивируют.

29

Re: CMD/BAT: ffmpeg Замена аудиодорожки

kvk-2019, в моем случае обучение подразумевается поверхностное. Найденные примеры использую как шаблоны, если понимаю, как делить эти примеры на составляющие, применяю в чем-то своем. Иногда смотрю рабочее решение, и понимаю, за что отвечает каждая строка, а иногда использую бездумно. Учить языки для меня непосильная затея в целом.

30

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Скрипт из 26-го поста работает, но готовое название выдает на основе аудио, а хотелось бы на основе видео. "Прочитать" скрипт, чтобы отредактировать под себя у меня не вышло, хотя на примере из 8-го поста все выглядит ясно.

Еще у меня не получилось использовать .wav, с .aac сработало.

31 (изменено: kvk-2019, 2020-01-18 07:15:41)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim, Если более понятно решение на vbs, используйте лучше его. Что касается моего варианта с cmd, то его, наверно, нужно модифицировать примерно вот так:

@echo off
echo ".mp3$.wav$.aac$" | findstr /i /c:"%~x1$" >nul && (echo %1 > "%~f0.dat" & exit /b)
if not exist "%~f0.dat" (echo "" & exit /b)
setlocal
set /p a=<"%~f0.dat"
echo ".mov$.mp4$.mts$" | findstr /i /c:"%~x1$" >nul || exit /b
if not defined a exit /b
ffmpeg -i %1 -i %a:~0,-2% -c:v copy -map 0:v:0 -map 1:a:0 -acodec aac -ab 128K -shortest "%~dpn1_replaced.mp4"
del /q "%~f0.dat"

То есть сначала задаём аудио, потом видео. Чтобы прийти к такому решению, нужно в командной строке посмотреть вывод "if /?", "call /?", "findstr /?", "help  del", ну и гуглить, по поводу ffmpeg тоже. И знание, что в mp4 в качестве аудио может быть только aac должно быть, а в качестве видео - только h.264 или h.265, насколько помню. Если интересует контейнер для любых форматов аудио и видео, то в таком случае можно использовать .mkv. Правда, замечу, что мой SmartTV на длинных видео не позволяет для контейнера .mkv перемещаться по записи, поэтому использую .ts, но на совсем длинных видео и он не помогает. Протестировал, но не во всех режимах. С wav работает у меня. Общая рекомендация: запускайте только те скрипты, работа которых после прочтения полностью понятна. Особенно касается скриптов на PowerShell.

32

Re: CMD/BAT: ffmpeg Замена аудиодорожки

kvk-2019 пишет:

в mp4 в качестве аудио может быть только aac

подразумевается, что wav будет кодироваться в поддерживаемый формат, а если aac, то использоваться как есть. Во всяком случае, команда ffmpeg из первого поста конвертирует (принимает) предлагаемый ему wav.

Протестировал последний вариант - название выходного файла - ок, но аудиодорожка не заменяется. В качестве видео использовал mp4.
Так как Ваш вариантне работает из контекстного меню, то есть его нужно находить и копировать перед использованием, пока в приоритете вариант от alexii.

33 (изменено: kvk-2019, 2020-01-18 06:41:02)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

Протестировал последний вариант - название выходного файла - ок, но аудиодорожка не заменяется. В качестве видео использовал mp4.

Поторопился, убрал -map. Теперь исправил, вернул обратно. Проверьте. Контекстное меню не обязательно. Можно открыть два окна проводника. Второе открываем при нажатом Shift. В одном окне проводника открыть папку с видео и аудио, в другом скрипт. Ухватить мышкой аудиофайл, если второе окно проводника не активно, переместить мышь на панели задач на проводник, выбрать тот из них, на в котором отрыта папка со скриптом, когда его окно станет активным, "бросить" захваченный аудиофайл на скрипт. После этого проделать то же с видеофайлом. Всё делается левой клавишей мыши. Примерно так. Раньше были хорошие описания в интернете, сейчас не нашёл.

34 (изменено: alexii, 2020-01-18 18:46:39)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim, кстати — Вы точно так же можете перетаскивать два выделенных файла (видео и аудио, порядок не важен) в Проводнике на вышеприведённый скрипт .vbs или на ярлык, указывающий на этот скрипт.

35 (изменено: becauseim, 2020-01-19 00:11:09)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, круто! Но я изначально искал вариант для контекстного меню, чттобы не искать расположение скрипта каждый раз.
А можно ли добавить в скрипт установку даты в формате DDHHMM вместо _replaced?

36

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

установку даты в формате DDHHMM

День-Час-Месяц? Весьма оригинально.

37

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexiiБ, минута.

38

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim, День-Час-Минута, серьёзно? Я бы уж делал тогда по полной — ГГГГММДД_ЧЧММСС. Что скажете?

39

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, для универсальности - да. Но я бы для себя лишнее убрал, чтобы не удлинять название.

40 (изменено: alexii, 2020-01-21 03:16:23)

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Убирайте :

+ открыть спойлер
Option Explicit

Dim objFSO

Dim objVideo
Dim objAudio

Dim strVideoFile
Dim strAudioFile

Dim objWshShell
Dim dtNow


If WScript.Arguments.Count = 2 Then
	With WScript.CreateObject("Scripting.FileSystemObject")
		Set objVideo = WScript.CreateObject("Scripting.Dictionary")
		Set objAudio = WScript.CreateObject("Scripting.Dictionary")
		
		With objVideo
			.CompareMode = vbTextCompare
			
			.Add "mov", "mov"
			.Add "mp4", "mp4"
			.Add "mts", "mts"
		End With
		
		With objAudio
			.CompareMode = vbTextCompare
			
			.Add "mp3", "mp3"
			.Add "wav", "wav"
			.Add "aac", "aac"
		End With
		
		If objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(0))) And _
			objAudio.Exists(.GetExtensionName(WScript.Arguments.Item(1))) Or _
			objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(1))) And _
			objAudio.Exists(.GetExtensionName(WScript.Arguments.Item(0))) Then
			
			If objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(0))) Then
				strVideoFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
				strAudioFile = .GetAbsolutePathName(WScript.Arguments.Item(1))
			Else
				strVideoFile = .GetAbsolutePathName(WScript.Arguments.Item(1))
				strAudioFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
			End If
			
			If .FileExists(strVideoFile) Then
				If .FileExists(strAudioFile) Then
					If StrComp(.GetParentFolderName(strVideoFile), .GetParentFolderName(strAudioFile), vbTextCompare) = 0 Then
						Set objWshShell = WScript.CreateObject("WScript.Shell")
						
						objWshShell.CurrentDirectory = .GetParentFolderName(strVideoFile)
						dtNow = Now()
						objWshShell.Run """ffmpeg.exe"" -i """ & strVideoFile & """ -i """ & strAudioFile & """ -c:v copy -map 0:v:0 -map 1:a:0 -shortest """ & _
							.GetBaseName(strVideoFile) & "_" & _
							Right("0000" & CStr(Year(  dtNow)), 4) & _
							Right("00"   & CStr(Month( dtNow)), 2) & _
							Right("00"   & CStr(Day(   dtNow)), 2) & _
							"_" & _
							Right("00"   & CStr(Hour(  dtNow)), 2) & _
							Right("00"   & CStr(Minute(dtNow)), 2) & _
							Right("00"   & CStr(Second(dtNow)), 2) & _
							".mp4""", 1, True
						
						Set objWshShell = Nothing
					Else
						WScript.Echo "Need appear source video file [" & strVideoFile & "] near source audio file [" & strAudioFile & "]."
						WScript.Quit 5
					End If
				Else
					WScript.Echo "Can't find source audio file [" & strAudioFile & "]."
					WScript.Quit 4
				End If
			Else
				WScript.Echo "Can't find source video file [" & strVideoFile & "]."
				WScript.Quit 3
			End If
		Else
			WScript.Echo "Need one source video file (" & Join(objVideo.Keys) & ") and one source audio file (" & Join(objAudio.Keys) & ")."
			WScript.Quit 2
		End If
		
		objAudio.RemoveAll
		objVideo.RemoveAll
		
		Set objAudio = Nothing
		Set objVideo = Nothing
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source video file> <Source audio file>"
	WScript.Quit 1
End If

WScript.Quit 0

41

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, круто! А если ничего не убирать, можно ли научить скрипт понимать, что во входном видео уже прописана дата в данном формате? Чтобы ее заменить при создании нового файла, а не дописывать.

42

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

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

Примеры имён нескольких таких файлов видео приведите.

43

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii
input: video.mp4, audio.wav output: video_20200121_125429.mp4

input: video_20200121_125429.mp4, audio.wav output: video_20200121_135413 (вместо video_20200121_125429_20200121_135413.mp4)

44

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Правильней проверять ошибки ffmpeg, так как не все аудиокодеки mp4 поддерживает.
https://en.wikipedia.org/wiki/Compariso … er_formats

45

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev, так он кодирует в поддерживаемый. Во всяком случае, команда из первого сообщения это подразумевает.

46

Re: CMD/BAT: ffmpeg Замена аудиодорожки

А есть ли смысл перекодировать поддерживаемое аудио?

47

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev, смысла нет, не знаю, как задать подобное условие.

48

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Нужно смотреть, какой кодек у аудио и сверять его с поддержкой этого кодека с контейнером mp4 у ffmpeg.
А также проверять ошибки ffmpeg на выходе.

49

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

не знаю, как задать подобное условие.

-acodec copy
( 2 * b ) || ! ( 2 * b )

50

Re: CMD/BAT: ffmpeg Замена аудиодорожки

И где тут условие?
Данный параметр указывает ffmpeg, что надо копировать кодек, а не кодировать.

51

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev пишет:

надо копировать кодек, а не кодировать

И верно. Но если указать кодек вместо copy, по будет перекодировать. Если мне не изменяет память. Подробности можно узнать из справки:


ffmpeg -formats
ffmpeg -codecs
( 2 * b ) || ! ( 2 * b )

52

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Это понятно, но нам надо заранее узнать необходимость кодирования.

53 (изменено: Rumata, 2020-01-21 20:58:48)

Re: CMD/BAT: ffmpeg Замена аудиодорожки


ffmpeg -i AUDIOFILENAME 2>&1 | find ": Audio: "

И вытащить из четвертой позиции имя кодека (подстрока после Audio, если разделители пробел и запятая).

Или просто посмотреть на расширение файла.

( 2 * b ) || ! ( 2 * b )

54

Re: CMD/BAT: ffmpeg Замена аудиодорожки

1) Расширение файла тут не поможет.
2) Даже после того как узнали кодек возможно придется узнавать количество каналов, частоту дискретизации и возможно другие параметры и проверять кушает ли ffmpeg такие файлы без перекодирования и что дает на выходе.
Я уже давно ffmpeg не пользовался, но помню, что у него был глюк с объединением MTS если в MTS было запихнуто PCM.

55

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev, в моем случае, видео - это всегда стандартный h264-h265 *.mp4, либо ProRes *.mov. Аудио дорожка одна.
По сути - да, напрашивается проверка: если входит mp4 и aac, то видео и аудио стоит объединить в режиме copy, если mp4 и wav - копировать свойства только видео.

56

Re: CMD/BAT: ffmpeg Замена аудиодорожки

А почему вы считаете, что wav не может быть в mp4?

57

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Malcev, я так думал. Но если не так, то для универсальности на бытовом уровне лучше вложить AAC, полагаю.

58

Re: CMD/BAT: ffmpeg Замена аудиодорожки

Бытовой уровень - понятие растяжимое.
Но тупой ffmpeg действительно не даёт замуксить PCM в mp4.
Приходится через ffmpeg PCM из WAV  копировать в MOV, а потом через mp4box муксить mp4 видео с mov аудио.
Ну и в контейнере WAV не обязательно PCM может быть, а например тот же MP3.

59

Re: CMD/BAT: ffmpeg Замена аудиодорожки

becauseim пишет:

А если ничего не убирать, можно ли научить скрипт понимать, что во входном видео уже прописана дата в данном формате? Чтобы ее заменить при создании нового файла, а не дописывать.

Пробуйте:

+ открыть спойлер
Option Explicit

Dim objFSO

Dim objVideo
Dim objAudio

Dim strVideoFile
Dim strAudioFile

Dim objWshShell
Dim objRegExp

Dim dtNow
Dim strResultName


If WScript.Arguments.Count = 2 Then
	With WScript.CreateObject("Scripting.FileSystemObject")
		Set objVideo = WScript.CreateObject("Scripting.Dictionary")
		Set objAudio = WScript.CreateObject("Scripting.Dictionary")
		
		With objVideo
			.CompareMode = vbTextCompare
			
			.Add "mov", "mov"
			.Add "mp4", "mp4"
			.Add "mts", "mts"
		End With
		
		With objAudio
			.CompareMode = vbTextCompare
			
			.Add "mp3", "mp3"
			.Add "wav", "wav"
			.Add "aac", "aac"
		End With
		
		If objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(0))) And _
			objAudio.Exists(.GetExtensionName(WScript.Arguments.Item(1))) Or _
			objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(1))) And _
			objAudio.Exists(.GetExtensionName(WScript.Arguments.Item(0))) Then
			
			If objVideo.Exists(.GetExtensionName(WScript.Arguments.Item(0))) Then
				strVideoFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
				strAudioFile = .GetAbsolutePathName(WScript.Arguments.Item(1))
			Else
				strVideoFile = .GetAbsolutePathName(WScript.Arguments.Item(1))
				strAudioFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
			End If
			
			If .FileExists(strVideoFile) Then
				If .FileExists(strAudioFile) Then
					If StrComp(.GetParentFolderName(strVideoFile), .GetParentFolderName(strAudioFile), vbTextCompare) = 0 Then
						Set objWshShell = WScript.CreateObject("WScript.Shell")
						objWshShell.CurrentDirectory = .GetParentFolderName(strVideoFile)
						
						Set objRegExp = WScript.CreateObject("VBScript.RegExp")
						objRegExp.Pattern = "^(.+_)\d{8}_\d{6}$"
						
						If objRegExp.Test(.GetBaseName(strVideoFile)) Then
							strResultName = objRegExp.Replace(.GetBaseName(strVideoFile), "$1" & FormatOwnDateTime(Now())) & ".mp4"
						Else
							strResultName = .GetBaseName(strVideoFile) & "_" & FormatOwnDateTime(Now()) & ".mp4"
						End If
						
						Set objRegExp = Nothing
						
						objWshShell.Run """ffmpeg.exe"" -i """ & strVideoFile & """ -i """ & strAudioFile & """ -c:v copy -map 0:v:0 -map 1:a:0 -shortest """ & strResultName & """", 1, True
						Set objWshShell = Nothing
					Else
						WScript.Echo "Need appear source video file [" & strVideoFile & "] near source audio file [" & strAudioFile & "]."
						WScript.Quit 5
					End If
				Else
					WScript.Echo "Can't find source audio file [" & strAudioFile & "]."
					WScript.Quit 4
				End If
			Else
				WScript.Echo "Can't find source video file [" & strVideoFile & "]."
				WScript.Quit 3
			End If
		Else
			WScript.Echo "Need one source video file (" & Join(objVideo.Keys) & ") and one source audio file (" & Join(objAudio.Keys) & ")."
			WScript.Quit 2
		End If
		
		objAudio.RemoveAll
		objVideo.RemoveAll
		
		Set objAudio = Nothing
		Set objVideo = Nothing
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source video file> <Source audio file>"
	WScript.Quit 1
End If

WScript.Quit 0
'=============================================================================

'=============================================================================
Function StrZeroPad(intValue, intCount)
	StrZeroPad = Right(String(intCount, "0") & CStr(intValue), intCount)
End Function
'=============================================================================

'=============================================================================
Function FormatOwnDateTime(dtNow)
	FormatOwnDateTime = _
		StrZeroPad(Year(  dtNow), 4) & _
		StrZeroPad(Month( dtNow), 2) & _
		StrZeroPad(Day(   dtNow), 2) & _
		"_" & _
		StrZeroPad(Hour(  dtNow), 2) & _
		StrZeroPad(Minute(dtNow), 2) & _
		StrZeroPad(Second(dtNow), 2)
End Function
'=============================================================================

60

Re: CMD/BAT: ffmpeg Замена аудиодорожки

alexii, работает! Спасибо!