1 (изменено: Malcev, 2015-09-16 01:40:03)

Тема: CMD/BAT: Вставка параметров из файла

У меня есть длинный код для объединения видеофайлов.

ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg

Он такой длинный, что через коммандную строку не запускается - из-за лимита символов в коммандной строке.
Можно ли как-то записать нужные мне параметры в файл и их уже запустить в cmd?
Типа:

ffmpeg -i command.txt -c copy output.mpg

А в commands.txt вставить "concat:input1.mpg|input2.mpg|input3.mpg"
Так выдает ошибку:

ffmpeg -i < command.txt -c copy output.mpg

2

Re: CMD/BAT: Вставка параметров из файла

Вполне доходчиво описано.

3 (изменено: Malcev, 2015-09-16 04:13:50)

Re: CMD/BAT: Вставка параметров из файла

Пример с файлом описан для Concat demuxer (разложение на потоки).
А мне надо файлово через Concat protocol.

4

Re: CMD/BAT: Вставка параметров из файла

Не пробовал еще такого. Не приходилось.

создать файл - список файлов на обработку и указать его как входной файл

ffmpeg -f concat -i list-of-files.txt ...

можно использовать шаблоны printf-подобные (возможно, знак процента надо удвоить в cmd.exe)

-f concat -i "input%%s.mpg" ...

использовать pattern_type

ffmpeg -f concat -pattern_type glob -i "input*.mpg"...
( 2 * b ) || ! ( 2 * b )

5 (изменено: Malcev, 2015-09-16 04:27:32)

Re: CMD/BAT: Вставка параметров из файла

А  -f concat не означает разве, что объединение файлов будет происходить на уровне потоков?
У меня при демуксе и муксе появляются различные ошибки, которые приводят к рассинхрону.
Поэтому этот вариант не годится.

6

Re: CMD/BAT: Вставка параметров из файла

Тогда остаётся клеить по ограничениям с временно созданными кусками.

7

Re: CMD/BAT: Вставка параметров из файла

А если записать все в *.bat работает?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

8

Re: CMD/BAT: Вставка параметров из файла

Нет.

9

Re: CMD/BAT: Вставка параметров из файла

Ещё можно к PoSh обратиться, там строка в тысячи, десятки и сотни тысяч раз длиннее.

10

Re: CMD/BAT: Вставка параметров из файла

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

ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg

сделать

ffmpeg -i "concat:1|2|3" -c copy output.mpg

?

11 (изменено: Malcev, 2015-09-16 16:02:25)

Re: CMD/BAT: Вставка параметров из файла

Переименовывать не совсем хочется, так как файлы могут лежать на SD карточке.

Ещё можно к PoSh обратиться

Так как, программу планирую запускать на разных компьютерах, то везде возиться с установкой PoSh, наверное будет затруднительным?
Пока создаю переменную с названием файлов без пути (для запуска из AHK коммандой Run из директории, где расположены файлы), если директория меняется, то добавляю новый путь в переменную. Тут засада - размер увеличивается, так как прибавляется каждый раз к названию I:\PRIVATE\AVCHD\BDMV\STREAM\.
Если размер больше 16кб, то создаю новую переменную.
И приходится кодировать во временные папки, так как , как я понимаю, named pipes windows не поддерживает.

12

Re: CMD/BAT: Вставка параметров из файла

Malcev пишет:

Так как, программу планирую запускать на разных компьютерах, то везде возиться с установкой PoSh, наверное будет затруднительным?

Была такая страница (жаль ссылки битые), можно порыться в сети, может, кто выкладывал.

Malcev пишет:

И приходится кодировать во временные папки, так как , как я понимаю, named pipes windows не поддерживает.

А в первый из склеиваемых писать не пробовали? Или ругнётся?

13

Re: CMD/BAT: Вставка параметров из файла

Пробовал, но не получалось.

14

Re: CMD/BAT: Вставка параметров из файла

ypppu, решил воспользоваться вашей идеей с копированием файлов в вотчфолдер и переименовкой их в китайские символы, начиная с 0x20000. Теперь файлов может быть до 5400. Это больше, чем нужно.
Спасибо!

15

Re: CMD/BAT: Вставка параметров из файла

Я думал они и так в одной папке все лежат. Предлагал просто их переименовать, например AHK-скриптом, и тут же создать bat-файл тем же скриптом.

16

Re: CMD/BAT: Вставка параметров из файла

Прошу прошения за глупый вопрос, но возможно у кого-нибудь есть готовый BAT для ffmpeg или sox для склейки нескольких mp3 из предопределенной папки, в один длинный?

17

Re: CMD/BAT: Вставка параметров из файла

https://trac.ffmpeg.org/wiki/Concatenate

18 (изменено: grisha.puding, 2023-03-17 18:24:32)

Re: CMD/BAT: Вставка параметров из файла

Уважаемый Malcev, Да! Красиво, спасибо, глубокий поклон, правда ранее ссылку уже дал уважаемый Flasher, да только готового примера там нет.
То что есть как я понимаю для Линукса.

В целом описания понятное, но составить рабочий БАТ фай не получается.
Посему и прошу может кто-то уже мучился и имеет рабочий вариант.

19 (изменено: grisha.puding, 2023-03-17 18:48:43)

Re: CMD/BAT: Вставка параметров из файла

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

Это одна из вариаций того что я предлагал но суть одна даже простую задачу с построением файлов из заданной папки в один длинный он не справился.



@echo off
setlocal enabledelayedexpansion

set DIR_A=<путь к директории A>
set DIR_B=<путь к директории B>
set DIR_C=<путь к директории C>

for %%A in ("%DIR_A%\*.mp3") do (
    echo Обрабатываем файл: %%~nxA

    REM Определяем продолжительность файла и округляем до ближайшей половины секунды
    for /f "usebackq delims=" %%B in (`sox --i -D "%%A"`) do set /a "duration=round(2*%%B)/2"

    REM Ищем произвольные файлы из директории B, чья суммарная продолжительность меньше или равна
    REM или чуть больше округленной продолжительности обрабатываемого файла из директории A
    set background_files=
    set total_duration=0
    for /f "tokens=* delims=" %%B in ('dir /b "%DIR_B%\*.mp3"') do (
        for /f "usebackq delims=" %%C in (`sox --i -D "%DIR_B%\%%B"`) do set /a "file_duration=round(2*%%C)/2"
        set /a "new_total_duration=total_duration+file_duration"
        if !new_total_duration! leq !duration! (
            set background_files=!background_files! "%DIR_B%\%%B"
            set total_duration=!new_total_duration!
        )
    )
    
    if defined background_files (
        REM Смешиваем файлы из директории B в единый фоновый трек и сохраняем во временный файл
        set background_file=%DIR_C%\%%~nxA_temp_background.mp3
        sox %background_files% -v -22 "%background_file%"

        REM Если длина фонового трека превысила длину обрабатываемого файла из директории A,
        REM обрезаем и приглушаем его
        if !total_duration! gtr !duration! (
            sox "%background_file%" "%background_file%" trim 0 !duration! fade t 0 !duration! 20
        )

        REM Смешиваем аудиокнигу из директории A и фоновый трек из директории C и сохраняем результат
        set output_file=%DIR_C%\%%~nxA
        sox -m -v 1 "%%A" -v 1 "%background_file%" -v 0.5 "%output_file%"

        echo Создан файл: %output_file%
    ) else (
        echo Не найдено подходящих файлов для создания фоновой музыки.
    )

    REM Очищаем временные файлы
    del /q "%DIR_C%\%%~nxA_temp*.mp3"
)

Этот пример конечно для SOX но суть также любые предлагаемые варианты не работали ни в каком виде, я даже переименовывал файлы в 1.mp3 2… 3… предполагая что дело в экранировании пробелов и других символов, но результат не менялся список передаваемый в FFMPEG не воспринимался не в каком виде.

Вот я и решил спросить у реальных программистов.

20

Re: CMD/BAT: Вставка параметров из файла

К слову у меня есть рабочий пример для SOX и он кстати очень прост:


@echo on
setlocal enabledelayedexpansion
REM Склеивание MP3-файлов
sox "D:\_WORK-set\*.mp3" "D:\#PROD\output.mp3"
REM Уменьшение громкости
sox "D:\#PROD\output.mp3" "D:\#PROD\final.mp3" vol -22dB
REM Удаление временного файла
del "D:\#PROD\output.mp3"
echo Готово!
pause

Но хочется добиться похожего результата по средствам FFMPEG.

21

Re: CMD/BAT: Вставка параметров из файла

Однажды я снимал грозу (молнии) на камеру телефона. Потом видео просматривал, искал и вырезал фрагменты с молниями и собирал эти фрагменты в один конечный файл. Ключевая команда примерно такая:


dir /b final-?.mp4 | busybox sed "s/^/file /" | ffmpeg.exe -protocol_whitelist file,pipe -f concat -i - -c:v copy -y final-123.mp4

Что значат параметры и опции команды ffmpeg - не помню, уточняйте сами по документации. По мне, она весьма громадна и крайне неинтуитивна.

Я использую BusyBox - он дает возможность использовать средства Unix команд. Рекомендую.

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