Вопрос или проблема
Загрузка видеопотока с помощью curl привела к получению ~400 файлов *.ts, каждый из которых размером около 1 МБ. Они последовательно пронумерованы video1.ts, video2.ts, …video400.ts. Теперь мне нужно объединить их в один файл, естественно, в правильном порядке (чтобы video10.ts следовал за video11.ts, а не за video110.ts).
Я пытался придумать что-то вроде “for i in *.ts; do ….”, но просто не могу это понять. Также ffmpeg и avconv слишком сложны для меня.
Кто знает, как объединить эти 400 файлов в правильном порядке в новый файл? Спасибо!
Кратчайший способ объединить все .ts в один .ts файл: в Linux
cat *.ts > all.ts
Кратчайший способ объединить все .ts в один .ts файл: в Windows (используя cmd)
copy /b *.ts all.ts
filenames="`ls -rt1 $input | tr '\n' '|' | sed '$ s/.$//'`"
ffmpeg -i "concat:$filenames" -c copy out.ts
,
где $input
– это имя файла или экранированное регулярное выражение (например, \*.ts).
Все ответы на этот вопрос, которые вводят в заблуждение читателей, призывающие объединять TS-файлы перед запуском ffmpeg, неверны. Чтобы гарантировать, что аудио и видео не выйдут из синхрона во время сборки mp4-потока, следует использовать плохо документированную, но важную функцию “-f concat” ffmpeg.
delimiterBeforeFileNumber="-"
ls |egrep '[.]ts$' \
|sort "-t$delimiterBeforeFileNumber" -k2,2n \
|sed -r "s/(.*)/file '\1"https://superuser.com/" >ts.files.txt
ffmpeg -f concat -i ts.files.txt -c copy tsw.014.ts.mp4
Две подготовительные строки кода просто создают файл, содержащий список TS-файлов в этом формате строки, который используется ffmpeg как плейлист.
file 'seg-37-a.ts'
Что-то вроде этого сработает:
for i in `seq 1 400`; do cat "video$i.ts" >> newvideo.ts; done
но теперь аудио рассинхронизировано примерно на 0,5 секунды, и каждые несколько секунд происходят ~0,5 сек. тишины (предположительно, когда фрагменты соединяются).
Это старый вопрос, но я надеюсь, что ответ может быть полезен для других.
Основываясь на этом источнике, следующий скрипт выполнит задачу, предполагая ffmpeg 1.1
и выше.
#!/bin/bash
for i in `seq 0 $totalNumberOfTsFiles`; do echo file "'${i}.ts'" >> Input.txt ; done
/home/hq6/bin/ffmpeg-2.3.3/ffmpeg -f concat -i Input.txt -c copy output.ts
Попробуйте следующую команду:
cat video?.ts video??.ts video???.ts > out.ts
тема старая, но вы всегда можете найти ее здесь в Google. Так что я использую avidemux для всех видов видео, которые хочу объединить под Linux. У него есть опция “добавить”. Пользоваться им очень интуитивно, и он существует уже долго.
Ответ или решение
Чтобы объединить множество файлов формата .ts в один файл, необходимо учитывать порядок, в котором они будут соединяться, так как это важно для корректного воспроизведения видео. Я приведу несколько методов для достижения этой цели как для пользователей Linux, так и для пользователей Windows, а также представлю более продвинутые решения с использованием ffmpeg
.
Решение для Linux:
-
Использование
cat
:
Если у вас 400 файлов, пронумерованных от video1.ts до video400.ts, вы можете просто выполнить следующую команду в терминале:cat video*.ts > output.ts
Эта команда объединит все файлы, соответствующие шаблону, в новый файл
output.ts
. Если имена файлов не следуют строгой нумерации, такой как video1.ts, video2.ts и т.д., может произойти неправильный порядок. -
Использование
ffmpeg
:
ffmpeg
предоставляет более надежный способ объединения файлов, особенно важных для сохранения синхронизации звука и изображения. Ниже приведен пример скрипта:#!/bin/bash # Создание файла списка for i in $(seq 1 400); do echo "file 'video$i.ts'" >> mylist.txt done # Объединение файлов ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.ts
В этом примере сначала создается файл
mylist.txt
, содержащий список всех .ts файлов, а затем используетсяffmpeg
для их объединения.
Решение для Windows:
-
Использование командной строки:
В Windows можно использовать командуcopy
для объединения файлов:copy /b video1.ts + video2.ts + video3.ts + ... + video400.ts output.ts
Однако для автоматизации процесса можно использовать следующий командный файл (batch file):
@echo off setlocal enabledelayedexpansion set output=output.ts echo. > %output% for /L %%i in (1,1,400) do ( echo file video%%i.ts >> mylist.txt ) ffmpeg -f concat -safe 0 -i mylist.txt -c copy %output%
Заключение:
-
Третий способ: Использование графических программ: Вы можете использовать графические интерфейсы, такие как
Avidemux
илиTSSplitter
, которые позволяют легко перетаскивать файлы и объединять их без необходимости в вводе команд. Это может быть более удобно, если у вас нет опыта работы с терминалом или командной строкой. -
Замечания: Убедитесь, что все ваши .ts файлы кодируются одинаково, чтобы избежать проблем с совместимостью при их объединении.
Эти методы помогут вам быстро и эффективно объединить ваши .ts файлы в один целый файл.