V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
watara
V2EX  ›  FFmpeg

关于 Linux 下使用 ffmpeg 大批量合并 ts 文件,求助下各位 V 友

  •  
  •   watara · 2014-11-09 19:51:13 +08:00 · 25106 次点击
    这是一个创建于 3665 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我需要把一个目录下的大量文件(名字非常规律的,都是 file001.ts,file002.ts,file003.ts.......有一千多个文件)合并成一个文件,我原来想导出到windows里用windows工具合并,但发现非常不完美,有的工具在衔接出会花屏,一秒的样子(每个ts片段大概10秒的样子。。。1000多个文件合并,差不多十分之一的时间花屏。。。),有点工具不花屏,但会有轻微的停顿,有的工具到后面会导致声音视频不同步。。。。
    最后想想还是用linux好了,用的ffmpeg来合并的,用了十个文件做测试,发现很流畅,完全符合要求,当时现在的问题在于。。。。我怎么批量导入这1000多个文件呢。。。我做测试的时候用的下面的命令:

    ffmpeg -i "concat:file001.tsfile002.ts|file003.ts|file004.ts" -acodec copy -vcodec copy -absf aac_adtstoasc out.mp4

    我试着使用 * 通配符,不过提示找不到*.ts。。。。。加前缀也是不行,用绝对地址也不行。。。我估计是不是得用正则啥的了?不过我shell基本上不会。。。正则也是。。。所以求助下各位了,谢谢
    12 条回复    2014-11-09 22:02:21 +08:00
    watara
        1
    watara  
    OP
       2014-11-09 19:59:09 +08:00
    我有一个思路,不过不知道怎实现。。。。就是用循环,比如要合并001、002、003、004、005这4个文件,第一次先合并001和002,产生一个out.ts,第二次再让out.ts和003合并,再产生一个out.ts,如此循环,我不是程序猿,不知道这思路对吗。。。。
    Lelouchcr
        2
    Lelouchcr  
       2014-11-09 20:18:07 +08:00   ❤️ 1
    我也干过这事情,用来合并hls流,差不多500+个。其实就是你上面的思路,只不过concat部分用代码写个循环就行啦。

    比如

    python 写

    cmd = "ffmpeg -i \"concat:"

    for i in xrange(1):
    cmd += 'file%03d'%3

    cmd += '... out.mp4'

    print cmd
    Lelouchcr
        3
    Lelouchcr  
       2014-11-09 20:19:06 +08:00   ❤️ 1
    代码写错了,改不了。。。再发次
    cmd = "ffmpeg -i \"concat:"

    for i in xrange(1):
    cmd += 'file%03d'%i

    cmd += '... out.mp4'

    print cmd
    ysjdx
        4
    ysjdx  
       2014-11-09 20:21:22 +08:00   ❤️ 1
    ffmpeg -i `for i in {1..1000};do echo -e "file$i.ts|\c"` ;done
    `" -acodec copy -vcodec copy -absf aac_adtstoasc out.mp4
    seki
        5
    seki  
       2014-11-09 20:22:44 +08:00   ❤️ 1
    -i 还支持文件列表,剩下的事情就是怎么生成文件列表了
    old9
        6
    old9  
       2014-11-09 20:29:35 +08:00 via Android   ❤️ 1
    ffmpeg -f concat -i filelist.txt -c copy......

    filelist 格式类似
    file 'path/to/file001.ts'
    file 'path/to/file002.ts'
    ...

    生成这样的 filelist.txt 应该不难吧

    另外,Windows 下也有 ffmpeg
    em70
        7
    em70  
       2014-11-09 20:54:20 +08:00
    ts合并不需要ffempg,直接copy拼接就可以了
    SoloCompany
        8
    SoloCompany  
       2014-11-09 20:57:52 +08:00   ❤️ 1
    * 是 shell 解释的,你不能加 ""
    如果一定需要要加,可以用 “`echo *`" 代替
    sycsycsyc378
        9
    sycsycsyc378  
       2014-11-09 21:40:56 +08:00
    MPEG2 的还是 h264?前者直接合并播放会出错吧。
    watara
        10
    watara  
    OP
       2014-11-09 21:58:28 +08:00
    @seki
    @old9 感谢,我已经解决了,用的下面的命令,某位大神教的

    ls * | perl -nale 'chomp;push @a, $_;END{printf "ffmpeg -i \"concat:%s\" -acodec copy -vcodec copy -absf aac_adtstoasc out.mp4\n", join("|",@a)}'


    @sycsycsyc378 我的是h264的,接触ffmpeg不久,很多都是现找现用的,原来里面有这么多门道呢,谢谢哈
    @em70 嗯嗯,感谢,涨姿势了
    watara
        11
    watara  
    OP
       2014-11-09 22:00:57 +08:00
    谢谢楼上各位,问题已经解决了,我得继续学习学习了。
    watara
        12
    watara  
    OP
       2014-11-09 22:02:21 +08:00
    @old9 我之前也查到过这个方式,我也自己写了list文件,不过不知道为啥,出错了,有空我再看看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3226 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 12:14 · PVG 20:14 · LAX 04:14 · JFK 07:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.