Рейтинг:2

Как объединить несколько видеофайлов с разными кодеками? MP4/H.265

флаг cn

у меня очень очень очень уродливый скрипт для объединения нескольких файлов моих футбольных игр (у меня 10 камер на игру), и теперь я начинаю делать основные моменты каждой игры. Но некоторые камеры имеют разную частоту кадров и используют разные кодеки. Так что теперь я совершенно не понимаю, как заставить их работать в Linux. Я был бы в порядке с графическим интерфейсом или другим программным обеспечением для редактирования видео, если бы это потребовалось.

Уродливый сценарий (для контекста)

#!/бин/баш

#списокфайлов=""
#для файла в $(ls -1v *.MP4);do #выводит список файлов с четными номерами
# filesList="${filesList}${file}|"
#сделано
#filesList=${filesList%?} # удаляет конечную вертикальную черту
#ffmpeg -i "concat:$filesList" -c копировать ../$(дата +%Y%m%d_%H%M%S)_merged.mp4
# настроить по своему усмотрению.


простая копия () {    
    printf "Хотели бы вы иметь миниатюру:\n"
    выберите ответ в Да Нет Mkv
    делать
        сломать;
    сделано
}

проверить папки () { 
    d=$(zenity --file-selection --title="Выберите каталог и объедините все файлы .MP4 внутри папки" --directory)
}

простойКопировать
checkFolders

компакт-диск "$d"
эхо $(пароль)
какManyFolders=$(ls -l -tr "$(pwd)" | grep -c ^d)

если [ $howManyFolders -gt 1 ] 
тогда
    checkFolders
фи

currentDate=$(дата +'%m.%d.%Y_%H.%M')
safeVideoName="${d/ /_}"
safeVideoName="${safeVideoName////}"
echo "safeVideoName: ${safeVideoName}"
videoName="../${safeVideoName}_${currentDate}_merged"


если [ "$ ответ" = "Да" ] 
    тогда
        количествовидео = 0
        видеофильтр=""
        Список файлов=""
        для файла в $(ls -1v | grep -i mp4); сделать 
            filesList="${filesList} -i ${file}"
            videoFilter="${videoFilter}[${numberOfVideos}:v][${numberOfVideos}:a]"
            
            пусть "количествовидео=количествовидео+1"
        сделано
        echo "видеофильтр: ${videoFilter}"
        ffmpeg $filesList -vf "transpose=2,transpose=2,transpose=2" -filter_complex "${videoFilter}concat=n=${numberOfVideos}:v=1:a=1[vv][a];[vv ]overlay=main_w-overlay_w-5:main_h-overlay_h-5[v]:" -map "[v]" -map "[a]" ${videoName%/}.mp4
    Элиф [ "$ ответ" = "Mkv" ]
    тогда
        ffmpeg -safe 0 -f concat -i <(find . -type f -name '*.MP4' -printf "file '$PWD/%p'\n" | sort) -c copy ${videoName%/}. мкв
    еще
        лс-1в-тр | grep -i mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c копировать "${videoName%/}.mp4"
фи

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

ошибка наблюдается при объединении

// cmd - echo ls -1v -tr | grep -i mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -safe 0 -protocol_whitelist file,tcp,http,pipe -f concat -i - -c копировать "${videoName%/}.mp4"

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f528e4d3c0] Автоматическая вставка фильтра битового потока h264_mp4toannexb
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:1; предыдущий: 655360, текущий: 626560; изменение на 655361. Это может привести к неверным временным меткам в выходном файле.
[concat @ 0x55f528e436c0] DTS 1116270 < 1167534 не по порядку
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:0; предыдущий: 1226574, текущий: 1175310; меняется на 1226575. Это может привести к неправильным отметкам времени в выходном файле.
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:1; предыдущий: 655361, текущий: 627584; изменяется на 655362. Это может привести к неправильным отметкам времени в выходном файле.
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:0; предыдущий: 1226575, текущий: 1178313; меняется на 1226576. Это может привести к неправильным отметкам времени в выходном файле.
[mp4 @ 0x55f528e4fb40] Немонотонный DTS в выходном потоке 0:1; предыдущий: 655362, текущий: 628608; изменяется на 655363. Это может привести к неправильным отметкам времени в выходном файле.

введите описание изображения здесь

При необходимости могу предоставить примеры клипов :)

raj avatar
флаг cn
raj
Ваш сценарий использует `ffmpeg` для объединения файлов, используя только псевдокодек `copy`. Если файлы закодированы по-разному, вам нужно выполнить фактическую перекодировку с помощью `ffmpeg`, т.е.вы должны предоставить фактическое имя выходного кодека вместо `copy`. Затем `ffmpeg` должен перекодировать все клипы в указанный вами формат. Возможно, вам потребуется добавить некоторые дополнительные параметры, определяющие детали кодирования, так как `ffmpeg` — это сложное программное обеспечение, которое вы должны поэкспериментировать и проверить, какие параметры дают наилучший результат.
raj avatar
флаг cn
raj
Кроме того, вам также, вероятно, потребуется предоставить некоторый фактический формат вывода вместо `concat`.
флаг cn
Ах интересно. Так что это займет гораздо больше времени, но это сработает. Интересно, могу ли я просто перекодировать файлы в формате MP4, а не 265? Я думаю, вы можете сделать проверку в `ffmpeg`, чтобы проверить, что это за файл?
raj avatar
флаг cn
raj
Я не думаю, что у `ffmpeg` есть параметр, который может сказать ему, что "если формат тот же, то не перекодировать". Если вы не скажете ему `копировать`, то он всегда будет перекодировать, даже из одного и того же формата в один и тот же. Таким образом, вам, вероятно, придется сначала перекодировать клипы H265 в MP4 (также с помощью `ffmpeg`), а затем объединить все файлы MP4, используя ваш скрипт. Но вы должны убедиться, что вы конвертируете их в MP4 с точно такими же параметрами (кодек, частота кадров, размер и т. д.), что и MP4, которые у вас уже есть.
raj avatar
флаг cn
raj
Но вы, вероятно, можете явно сказать `ffmpeg` `копировать` файлы, которые уже являются MP4, и перекодировать другие. Но вы должны сначала определить, какие есть какие. Вы можете использовать ffprobe, поставляемый с ffmpeg, для идентификации видеофайлов.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.