将数百个 ts 文件合并/连接/串联为一个 ts 文件

将数百个 ts 文件合并/连接/串联为一个 ts 文件

使用 curl 下载视频流后,我得到了大约 400 个 *.ts 文件,每个文件大小约为 1MB。它们按顺序编号为 video1.ts、video2.ts、...video400.ts。我现在需要将它们连接成一个文件,显然要按照正确的顺序(因此 video10.ts 后面应该是 video11.ts,而不是 video110.ts)。

我曾尝试过想出类似“for i in *.ts; do ....”的方法,但就是想不通。另外,ffmepg 和 avconv 对我来说太复杂了。

谁知道如何将这 400 个文件以正确的顺序合并为一个新文件?谢谢!

答案1

将所有 .ts 合并为一个 .ts 文件的最短方法:在 Linux 上

cat *.ts > all.ts

将所有 .ts 连接成一个 .ts 文件的最短方法:在 Windows 上(使用 cmd)

copy /b *.ts all.ts

答案2

filenames="`ls -rt1 $input | tr '\n' '|' | sed '$ s/.$//'`"

ffmpeg -i "concat:$filenames" -c copy out.ts

其中$input是文件名或转义的正则表达式(例如,\*.ts)。

答案3

这个问题的所有答案都误导读者在运行 ffmpeg 之前连接 TS 文件,这些答案都是错误的。为了确保在组装 mp4 流期间音频和视频不会不同步,应该使用 ffmpeg 中记录不多但很重要的“-f concat”功能。

    delimiterBeforeFileNumber="-"
    ls |egrep '[.]ts$' \
        |sort "-t$delimiterBeforeFileNumber" -k2,2n \
        |sed -r "s/(.*)/file '\1'/" >ts.files.txt

    ffmpeg -f concat -i ts.files.txt -c copy tsw.014.ts.mp4

这两行准备代码只是创建一个包含该行格式的 TS 文件列表的文件,该文件可供 ffmpeg 像播放列表一样使用。

    file 'seg-37-a.ts'

答案4

这是一个老问题,但我希望答案可以为其他人增添价值。

基于此引用,以下脚本将完成该工作,假设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

相关内容