Страница 1 из 2

Задачи для ffmpeg и медиафайлов активного каталога

Добавлено: Вс апр 17, 2016 20:43
Keeper
Привет, подскажите, пожалуйста код кнопки, для объединения выделенных mp4 файлов в новый и присвоения ему имени последнего выбранного.
Строка ffmpeg:

Код: Выделить всё

ffmpeg -f concat -i mylist.txt -c copy output
, где mylist.txt имеет вид:

Код: Выделить всё

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
Очень важно присваивать имя последнего выбранного файла, согласно сортировке, если это возможно.
PS: mencoder, хоть и имеет синтаксис приемлемый для написания конопки через %S, неподходит для меня ибо имеет проблемы с h264 и AAC, короче не объединяет оно с такими исходными данными как у меня, а ffmpeg оъединяет :D
Wiki ffmpeg: https://trac.ffmpeg.org/wiki/Concatenate
Спасибо.

[mod="Avada"]Замечание за оффтоп в теме "Обмен кнопками". Где запрашиваются кнопки, говорилось многократно. Сообщение перенесено. [/mod]

[mod="CaptainFlint"]По запросу Flasher'а обсуждение задач про ffmpeg вынесено в самостоятельную ветку.[/mod]

Добавлено: Вс апр 17, 2016 21:11
Flasher
Keeper
Если нужно сразу списком без перебора по отдельности, то через кнопку не очень удобно, т.к. реплейсинг в cmd в чистом виде не предусмотрен. Лучше vbs-ник.

Добавлено: Пн апр 18, 2016 12:18
Keeper
Flasher
Привет, спасибо за ответ! Если вас не затруднит, то выложите, пожалуйста, ваш VBS скрипт.
Вообще, мне нужна реализация вот такой схемы: https://yadi.sk/i/kpdEzNCZr5nZh
но, так как я не совсем понял про перебор по отдельности и реплейсинг, то я думаю у меня не составит труда, взяв за основу ваш VBS, придать скрипту нужный мне функционал. :)
Еще раз спасибо.

Добавлено: Вт апр 19, 2016 00:49
Flasher
Keeper

Код: Выделить всё

'======================================================================
' Склеить выбранные видеофрагменты в файл с именем последнего фрагмента
' Условие: путь запуска пустой
' Параметры: %F "<путь целевого каталога>" "<добавка к базовому имени>"
' Пример:    %F "%T" _joined
'======================= Путь к утилите FFmpeg ========================
Prog = """%COMMANDER_PATH%\Utils\FFmpeg\ffmpeg.exe"""
'======================================================================
With WScript.Arguments
  Title = "   Объединение видео" : C = .Count : If C = 0 Then WScript.Quit
  If C <> 3 Then MsgBox "Укажите 3 параметра!", 4144, Title : WScript.Quit
  List = .Item(0) : T = .Item(1) : PFix = .Item(2)
End With
Dim WSH : Set WSH = CreateObject("WScript.Shell")
With CreateObject("Scripting.FileSystemObject")
  All = .OpenTextFile(List).ReadAll : T = .BuildPath(T, "\")
  With New Regexp
    .IgnoreCase = True : .Multiline = True : .Global = True
    .Pattern = "^.*\.(3g[2p]2?|4xm|avi|asf|dat|dvr-ms|fl[iv]|film" &_
    "_cpk|gif|h26[134]|qtm2ts?|m4v|mkv|mo[dv]|mp4|mpe?g|mxf|nuv|"  &_
    "og[gm]|pva|rm|roq|swf|ts|tp|t[ox]d|vcd|vivo|vob|webm|wmv)(?!\\)$"
    If Not .Test(All) Then MsgBox "В выбранном списке нет " &_
    "поддерживаемых файлов!", 4144, Space(22) & Title : WScript.Quit
    With .Execute(All)
    If .Count = 1 Then WScript.Quit
    For i = 0 To .Count - 1
      S = S & "file '" & .Item(i).Value & "'" & VbCrLf
    Next : F = .Item(i - 1).Value End With
  End With
  With .OpenTextFile(List, 2) : .Write Left(S, Len(S) - 2) : .Close
  End With : If WSH.CurrentDirectory & "\" = T Then P = "L" Else P = "R"
  BN = .GetBaseName(F) & PFix : Ext = "." & .GetExtensionName(F)
  i = 0 : F = BN & Ext
  While .FileExists(T & F) Or .FolderExists(T & F)
    i = i + 1 : F = BN & " (" & i & ")" & Ext
  Wend : F = T & F: WSH.Run Prog & " -f concat -i " & List & " -c copy """ & F & """",0, True
  If .FileExists(F) Then WSH.Exec "%COMMANDER_EXE% /S /O /A /" & P & "=""" & F & """ /P=" & P
End With

Добавлено: Ср апр 20, 2016 10:47
Keeper
Flasher, большое спасибо вам за скрипт. Очень помогли мне!
Подскажите, если не трудно, последнюю вещь - где ему сказать чтобы окошко cmd'шное открывал в котором виден был бы процесс (что конкретно ffmpeg делает), если это возможно.
Спасибо.

Добавлено: Ср апр 20, 2016 13:32
Flasher
Keeper
Пож-та. 3 строка снизу, в конце 0 меняем на 1 (с активацией) или на 2 (свёрнутое).
А зачем? Тут после отработки курсор в ТС встаёт на полученный файл. Что ffmpeg делает и так понятно - склеивает. :)
Также обращу внимание, что случайно выделенные папки или неподдерживаемые файлы в отработку не попадут. Если файл в группе один, то ничего не произойдёт. Если выделены только неподдерживаемые файлы, то скрипт сообщит об этом. При повторных попытках склеить файлы с тем же именем будут создаваться новые с счётчиком.

Добавлено: Ср апр 20, 2016 17:50
Keeper
Flasher писал(а):А зачем?
Дело в том, что я пользовался, до этого скрипта, решением от MP4Tools, который крайне ревностно относился к разному FPS и разрешению у файлов, брался их сам перекодировать в итоге выдавая невоспроизводимый файл. Из-за этого я испортил пару файлов и теперь, для спокойствия, хочу следить за выводом в консоли.
Но, как я выяснил, ffmpeg очень спокойно клеит разный битрейт|разрешение, чему очень рад, но всеже поглядывать на вывод будет не лишним, задача ведь еще и в том чтобы не проверять выходящий результат, или не весь, а выборочно.
Незнаю, канонично ли такое положение или нет, но PotPlayer нормально относится с склеенным в ffmpeg'e файлам с разным битрейтом|разрешением, в отличие от результата из mp4joiner'a. Вообще, подозреваю, исходя из изысканий в сети, что выбранная мною связка h264+AAC с вариативным битрейтом - не по стандарту, но уже поздно что-то менять, да и не относится это к теме.

Еще раз спасибо огромное.

Добавлено: Вс май 08, 2016 16:59
Mailk
у меня ошибку дает =строка 34 символ 22, не могу найти указанный фаил.
Куда скопировать FFMpeg? Где свой путь прописать в скрипте?

Добавлено: Вс май 08, 2016 18:53
Flasher
Ошибки не будет при стандартной установке в системную папку.

Добавлено: Вс май 08, 2016 19:14
Skif_off
Flasher
Почему бы не добавить возможность указать путь, как в других скриптах? Ни разу не ставил FFmpeg, при необходимости использовал версию из MeGUI, про фанатов портативности и говорить нечего...:)

Добавлено: Вс май 08, 2016 19:22
Dimsok
Я тоже не понимаю выражение "ставить ffmpeg". Распаковал куда нужно и пользуйся.

Добавлено: Вс май 08, 2016 22:59
Flasher
Skif_off
Keeper указал строку без пути, что и подразумевало системную привязку. Да и про фанатов малоразмерности не забываем. Ладно, добавил в скрипт.

Dimsok
Распаковка или установка - не суть дела. Хотя что-то мне подсказывать, что кое-чьи "исправленные" c:\Program Files\makedict\makedict.exe и т.п. к распаковке ровным счётом никакого отношения не имеют.

P.S.: А чего только сейчас сбежались? Раньше этот вопрос не мучал?

Добавлено: Пн май 09, 2016 11:31
Skif_off
Flasher писал(а):Keeper указал строку без пути, что и подразумевало системную привязку. Да и про фанатов малоразмерности не забываем.
Мне показалось, подразумевало краткость, сестру таланта, но спорить не буду :) К слову о малоразмерности - UPX сжимает чуть ли не в 2 раза (2.х).

И нашим, и вашим - что-нибудь типа
[cut]

Код: Выделить всё

If Not .FileExists(Prog) Then
  If .FileExists("""%WinDir%\System32\ffmpeg.exe""") Then
    Prog = """%WinDir%\System32\ffmpeg.exe"""
  Else
    Prog = """%WinDir%\SysWOW64\ffmpeg.exe"""
  End If
End If
[/cut]
(Или .FileExists(Prog) нужно брать в скобки?) У себя в некоторых случаях делаю подобным образом.
Flasher писал(а):А чего только сейчас сбежались? Раньше этот вопрос не мучал?
Не пользовался, но даже мысли не возникало, что для этого скрипта было сделано такое исключение :)

Добавлено: Пн май 09, 2016 14:17
Flasher
Skif_off писал(а):К слову о малоразмерности - UPX сжимает чуть ли не в 2 раза (2.х).
Всё равно многовато.
Skif_off писал(а):И нашим, и вашим - что-нибудь типа
В этом не вижу смысла. Достаточно "ffmpeg" указать вместо пути.
Skif_off писал(а):Не пользовался
А, просто покритиковать пришёл, по-о-онятно...
    • Изображение

Добавлено: Вт май 10, 2016 14:42
Skif_off
Flasher
1. Тем не менее - спорно.
2. Ага, просто привычка указывать полный путь, а тут ещё System32/SysWOW64...
3. Спросить, почему в этом скрипте со сторонней утилитой нет возможности задать свой путь сразу после шапки скрипта, как у тебя обычно, - это "покритиковать"? :))