使用 ffmpeg 复制编解码器将 *.ts 文件合并为单个 mp4

Ana*_*Ana 65 codec mp4 ffmpeg command-line video-conversion

我有一堆由单个 index.m3u8 文件描述的 ts 段:

index.m3u8        
segment1_0_av.ts  
segment2_0_av.ts  
segment3_0_av.ts  
segment4_0_av.ts  
segment5_0_av.ts
Run Code Online (Sandbox Code Playgroud)

我知道它们都以相同的方式编码。ffprobe 给了我以下内容:

Input #0, mpegts, from 'segment1_0_av.ts':
  Duration: 00:00:10.00, start: 0.100511, bitrate: 1251 kb/s
  Program 1 
    Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 960x540 [SAR 1:1 DAR 16:9], 12.50 fps, 25 tbr, 90k tbn, 25 tbc
    Stream #0:1[0x101]: Audio: aac ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 105 kb/s
    Stream #0:2[0x102]: Unknown: none ([21][0][0][0] / 0x0015)
Run Code Online (Sandbox Code Playgroud)

我想将它们组合成一个 mp4 容器。但是当我尝试以下命令时:

ffmpeg -f concat -i filelist.txt -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

在从 index.m3u8 文件生成 filelist.txt 的地方,它抱怨无法读取各种文件。但是转换 ts 文件本身似乎工作正常。我想我没有正确使用 ffmpeg。

如何使用 ffmpeg 使用复制编解码器将 index.m3u8 描述的 ts 文件组合到单个 mp4 容器中?

sza*_*ary 81

我不确定为什么 ffmpeg 给你一个错误。然而 ts 是少数可以简单连接的格式之一。然后,一旦你有一个单一的 ts,transmux 到 mp4。

在窗户下:

copy /b segment1_0_av.ts+segment2_0_av.ts+segment3_0_av.ts all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4
Run Code Online (Sandbox Code Playgroud)

在 GNU/Linux 下,使用 bash:

cat segment1_0_av.ts segment2_0_av.ts segment3_0_av.ts > all.ts
ffmpeg -i all.ts -acodec copy -vcodec copy all.mp4
Run Code Online (Sandbox Code Playgroud)

  • 您可能还需要`-bsf:a aac_adtstoasc`。 (12认同)
  • 有趣的是,该命令不是 `ffmpeg copy ...`,它是 `copy ...`(在 Windows 下) (2认同)

Jua*_*ino 43

使用 copy 或 cat 来组合文件,如 szatmary 的当前最佳答案可能会让您的文件播放远远超过限制并且无法搜索和播放问题。

相反,要正确组合这些文件,请按照https://trac.ffmpeg.org/wiki/Concatenate 中的说明使用 ffmpeg 。(如果您还没有安装 ffmpeg,请在此处安装https://github.com/adaptlearning/adapt_authoring/wiki/Installing-FFmpeg。)

如果你懒得阅读我的第一个链接,你基本上必须在你所在的文件夹中创建一个 .txt 文件,列出你想要组合的所有文件(我的第一个链接提供了如何轻松完成的说明)重新进行连接:

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
Run Code Online (Sandbox Code Playgroud)

这是我的第一个链接的复制粘贴,以一种方式创建文本文件,例如,如果您在命令行上使用 Windows,但显然您可以手动或根据需要制作文件:

(for %i in (*.ts) do @echo file '%i') > mylist.txt
Run Code Online (Sandbox Code Playgroud)

仔细检查您的 .txt 文件是否看起来不错并且格式正确!

在此之后,在命令行上运行:

ffmpeg -f concat -i mylist.txt -c copy all.ts
Run Code Online (Sandbox Code Playgroud)

其中 'mylist.txt' 是您刚刚制作的 .txt 文件。

检查生成的文件是否正确播放视频。从这里,如果您愿意,您可以像往常一样转换为 mp4:

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

  • 对我来说,这会导致每个连接点出现音频口吃,而接受的答案则不会。使用此方法生成的文件也稍大一些。 (4认同)

Fra*_*ani 13

放在一起

使用 Juan Aquino 的答案(并更正第一个命令以与 Bash 兼容并使用文件的自然顺序),加上 7vujy0f0hy 的答案,Linux Bash shell 的简单工作脚本是:

#!/bin/bash
for i in `ls *.ts | sort -V`; do echo "file $i"; done >> mylist.txt
ffmpeg -f concat -i mylist.txt -c copy -bsf:a aac_adtstoasc video.mp4
Run Code Online (Sandbox Code Playgroud)


Vla*_*čík 10

从 m3u8 播放列表连接多个视频文件的正确方法是

ffmpeg -i "index.m3u8" -codec copy output.mp4


  • m3u8 播放列表可以在网络上或本地目录中
    • 它包含相对于播放列表的文件路径列表
  • -codec copy 避免编码
  • 容器类型很重要:
    • *.mp4 很好,但从网络获取播放列表时,多路复用似乎有点慢
    • *.mkv或者*.ts最适合我


7vu*_*0hy 8

2017年答案

但是当我尝试诸如 之类的命令时...,它会抱怨无法读取各种文件。

当我ffmpeg -i some.ts -c copy some.mp4在某个视频上执行时,我收到此错误消息:

Malformed AAC bitstream detected: use the audio bitstream filter 
'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)

av_interleaved_write_frame(): Operation not permitted
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,执行ffmpeg -i some.ts -c copy -bsf:a aac_adtstoasc some.mp4修复它。

  • 获取一个足够新的`ffmpeg`,它现在会自动执行此操作。 (6认同)

LF-*_*ney 7

您可以使用管道将这些 ts 文件输入到 ffmpeg并输出 mp4 文件。

cat *.ts | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4

或者如果你的文件名没有顺序,

grep .*.ts index.m3u8 | xargs cat | ffmpeg -i pipe: -c:a copy -c:v copy output.mp4