Объединение сотен файлов ts в один файл ts

Вопрос или проблема

Загрузка видеопотока с помощью 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

Лучшее решение:

Скачайте TSSplitter, нажмите на вкладку “JOIN” и перетащите все файлы в окно!

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

тема старая, но вы всегда можете найти ее здесь в Google. Так что я использую avidemux для всех видов видео, которые хочу объединить под Linux. У него есть опция “добавить”. Пользоваться им очень интуитивно, и он существует уже долго.

Ответ или решение

Чтобы объединить множество файлов формата .ts в один файл, необходимо учитывать порядок, в котором они будут соединяться, так как это важно для корректного воспроизведения видео. Я приведу несколько методов для достижения этой цели как для пользователей Linux, так и для пользователей Windows, а также представлю более продвинутые решения с использованием ffmpeg.

Решение для Linux:

  1. Использование cat:
    Если у вас 400 файлов, пронумерованных от video1.ts до video400.ts, вы можете просто выполнить следующую команду в терминале:

    cat video*.ts > output.ts

    Эта команда объединит все файлы, соответствующие шаблону, в новый файл output.ts. Если имена файлов не следуют строгой нумерации, такой как video1.ts, video2.ts и т.д., может произойти неправильный порядок.

  2. Использование 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:

  1. Использование командной строки:
    В 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 файлы в один целый файл.

Оцените материал
Добавить комментарий

Капча загружается...