使用正确的时间戳连接TS文件

Pet*_*119 5 ffmpeg mpeg2-ts

我正在尝试将多个ts块文件合并到一个文件中,而不会丢失任何质量或重新编码.这些文件是从实时流中获取的,但是我试图以不同的顺序合并它们,而不是它们被流式传输的顺序.

文件示例:

0000000033.ts
0000000034.ts
0000000039.ts
0000000044.ts
Run Code Online (Sandbox Code Playgroud)

我试过了:

cat 0000000033.ts 0000000034.ts 0000000039.ts 0000000044.ts >combined.ts
Run Code Online (Sandbox Code Playgroud)

ffmpeg -i "concat:0000000033.ts|concat:0000000034.ts|concat:0000000039.ts|concat:0000000044.ts" -c copy -bsf:a aac_adtstoasc output.mp4
Run Code Online (Sandbox Code Playgroud)

这有点起作用,但是我不是在4秒左右,而是在15左右.它以这样的方式播放:

[first 2 clips]
[5 secs pause]
[39.ts]
[5 secs pause]
[44.ts]
[done]
Run Code Online (Sandbox Code Playgroud)

这种情况发生在cat和ffmpeg组合版本中.因此,似乎ts块包含来自流的时间戳.

我如何解决这个问题,使其成为一个连续的剪辑?

这里的块更多的是一个例子,块将被动态选择.

Dou*_*eco 7

如果您有很长的 TS 文件列表,您可以创建一个播放列表,该文件包含以下行格式的 TS 文件列表:

    file 'seg-37-a.ts'
Run Code Online (Sandbox Code Playgroud)

这些命令生成这样一个文件,其中 TS 文件按数字排序。

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

然后创建单个文件就可以使用-f concatffmpeg的选项的修饰符来读取播放列表了-i

    ffmpeg -f concat -i ts.files.txt -c copy tsw.014.ts.mp4
Run Code Online (Sandbox Code Playgroud)


use*_*793 6

TS 文件实际上可以使用 Windows 的“复制”命令进行合并。以下将合并当前文件夹中的每个 TS。然后,一旦你有了一个 ts,就可以将其转换为 mp4,而无需重新编码。我确认视频持续时间是正确的,与 ffmpeg 的 concat 不同。

copy /b *.ts all.ts

ffmpeg -i all.ts -c copy all.mp4
Run Code Online (Sandbox Code Playgroud)


Gya*_*yan 5

尚未检查这是否适用于 concat 协议,但您需要生成一组新的时间戳。

ffmpeg -i "concat:0000000033.ts|0000000034.ts|0000000039.ts|0000000044.ts" \
       -c copy -bsf:a aac_adtstoasc -fflags +genpts output.mp4
Run Code Online (Sandbox Code Playgroud)


小智 -1

示例的文件编号准确吗?由于 0033.ts 和 0034.ts 一起播放,但需要 5 秒才能到达 0039.ts,然后再花费 5 秒到达 0044.ts,因此 0034 + 5 秒 = 0039 和 + 5 秒 = 0044 那么您是否以正确的方式加入它们命令?

抱歉,我误读了这个问题,但关于你的问题,一旦你有了 15 秒的剪辑,有一个来自 moyea 的名为 flv editor lite 的程序,它将接收 .mp4 文件并将其转换为 .flv,并允许你减少多余的时间文件并将其导出为一个文件,但随后您需要再次重新转换回 .mp4