使用 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