Как объединить файлы в правильном порядке, используя командную строку - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть папка с фрагментами видео из видео mpeg-dash.есть файл «init.mp4» вместе с 275 сегментами, то есть «seg-1.m4s», «seg-2.m4s» и так далее.Я хочу объединить их в один файл.Я использую следующую команду в cmd: copy /b init.mp4 + seg-*.m4s source.mp4 Приведенный выше код объединяет файлы в неправильном порядке. см. Порядок объединения

Как объединить файлы в правильном порядке, например, 1,2,3 ... 9,10,11..19,20 ...

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

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Это можно сделать довольно легко. Поместите этот код в файл с именем mp4match.ps1. Ключ к этому коду в том, что сортировка производится по числовому значению в имени файла. Извлекается regex.

$segments = Get-ChildItem -File -Filter 'seg-*.mps' |
    Sort-Object @{Expression={([int]([regex]::match($_.Name, 'seg\-(\d*).mps')).Groups[1].Value)}} |
    ForEach-Object { $_.Name }

'init.mp4 ' + $segments -join ' '

Затем используйте этот пакетный файл для его запуска. Когда команда COPY выглядит правильно, удалите ECHO в начале строки.

FOR /F "delims=" %%f IN ('powershell -NoProfile -File .\mp4match.ps1') DO (
    SET "FILE_LIST=%%f"
)
IF EXIST ".\source.mp4" (DEL ".\source.mp4")
COPY /Y %FILE_LIST% source.mp4
0 голосов
/ 19 ноября 2018

Очень простое решение для пакетных файлов:

@echo off
setlocal EnableDelayedExpansion

rem Sort file names in numerical order
for /F "tokens=1,2 delims=-." %%a in ('dir /B *.m4s') do (
   set /A "num=1000+%%b"
   set "file[!num!]=%%a-%%b.m4s"
)

rem Create the ordered list
set "files=init.mp4"
for /F "tokens=2 delims==" %%a in ('set file[') do set "files=!files! + %%a"

rem Do it
copy /B %files% source.mp4
0 голосов
/ 19 ноября 2018

Я думаю, что вам нужно переименовать файлы:

 1 -  9 to 001 - 009:
10 - 99 to 010 - 099:

в cmd:

for /l %l in (1 1 9) do @ren seg-%l.m4s seg-00%l.m4s
for /l %l in (10 1 99) do @ren seg-%l.m4s seg-0%l.m4s

и в пакетном файле:

for /l %%l in (1 1 9) do ren seg-%%l.m4s seg-00%%l.m4s
for /l %%l in (10 1 99) do ren seg-%%l.m4s seg-0%%l.m4s

После этого запустите ваш код:

copy /b init.mp4 + seg-*.m4s source.mp4 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...