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

ffmpeg 合并 2 个视频文件时 太慢的问题怎么解决?

  •  
  •   Trinity888 · 2020-10-18 09:19:39 +08:00 · 6824 次点击
    这是一个创建于 1495 天前的主题,其中的信息可能已经有所发展或是发生改变。

    情况描述:

    1. 项目环境:Qt 编写的应用程序,Win10 系统,MySQL 数据库

    2. 学生在考试的过程中,会录制 2 个视频文件,交卷时,需要将 2 个视频文件合并为 1 个视频文件,并且提交至内网的服务器上。

    3. 合并命令如下:

    ffmpeg -i a.mp4 -i b.mp4 -filter_complex [0:v]pad=iw2:ih[a];[a][1:v]overlay=w1 out.mp4

    现在的情况是:点击交卷时,先合并视频文件,再上传文件,再提交,这个过程非常慢,影响使用了。

    大家有更好的解决办法吗,求教,感谢

    第 1 条附言  ·  2020-10-18 17:15:15 +08:00
    说明一下:这 2 个视频拼接在一起做成 1 个视频,显示在一个两屏画面中,因为要对比着看画面。
    54 条回复    2020-10-19 15:40:53 +08:00
    falcon05
        1
    falcon05  
       2020-10-18 09:22:15 +08:00 via iPhone
    异步队列
    wunonglin
        2
    wunonglin  
       2020-10-18 09:23:06 +08:00
    RTX3090 + PCI SSD
    coderluan
        3
    coderluan  
       2020-10-18 09:31:17 +08:00   ❤️ 4
    楼主你这个参数需要重新编解码吧,自然很慢,如果视频本身的参数相同,可以直接用 concat 命令,非常快。
    mumbler
        4
    mumbler  
       2020-10-18 09:31:29 +08:00 via Android
    系统设计有问题,应该只提交原始资料,后台再统一合并,估计是想节约服务器了。

    合并用 ffmpeg 肯定慢,可以试试 mp4box
    wdhwg001
        5
    wdhwg001  
       2020-10-18 09:32:28 +08:00
    如果是直接复制流的话应该不会太慢啊,或者用 mkv 做容器?
    yangxin0
        6
    yangxin0  
       2020-10-18 09:32:55 +08:00 via iPhone
    加上 copy 选项就快了
    yangxin0
        7
    yangxin0  
       2020-10-18 09:33:25 +08:00 via iPhone
    你这个只是 remux 就行了
    coderluan
        8
    coderluan  
       2020-10-18 09:34:50 +08:00
    上面没看仔细,楼主并不是合并视频,是把视频左右拼接了,这种怎么样都不会太快的。
    AX5N
        9
    AX5N  
       2020-10-18 09:37:06 +08:00
    把视频拼在一个画面里需要重编码,重编码没有快的,去搞台配置牛 B 的电脑慢慢跑。
    coderluan
        10
    coderluan  
       2020-10-18 09:38:24 +08:00
    没拼接,迷糊了,还是用 ffmpeg concat 就行
    mingl0280
        11
    mingl0280  
       2020-10-18 09:48:23 +08:00 via Android
    你这不是拼接,你这是重编码,不应该在上传前处理的。 其实上传后服务器丢到队列里慢慢处理就行了……
    fyooo
        12
    fyooo  
       2020-10-18 09:53:25 +08:00
    love
        13
    love  
       2020-10-18 09:57:20 +08:00 via Android
    相同参数的视频貌似可以直接拼接或剪切不用重新编码
    laminux29
        14
    laminux29  
       2020-10-18 10:04:13 +08:00   ❤️ 5
    视频拼接更像是 c 女膜修复手术,左右两瓣都要进行缝合处理( decode + fix + render + encode )才行,并不是说把左右两瓣贴在一起(concat or append)它们就自然黏上了。
    wangxkww
        15
    wangxkww  
       2020-10-18 10:59:30 +08:00
    要是想快速完成这件事情,在服务端展示的时候放俩播放控件,只要控制能同时播放就好了
    mio4
        16
    mio4  
       2020-10-18 11:01:50 +08:00
    @laminux29 这个比喻绝了
    Trinity888
        17
    Trinity888  
    OP
       2020-10-18 11:05:17 +08:00
    @coderluan 您理解的正确,我们是需要把分别录制的 2 个不同的视频文件,合并拼接在 1 个视频文件中。
    incheon
        18
    incheon  
       2020-10-18 11:13:47 +08:00
    格式工厂
    Osk
        19
    Osk  
       2020-10-18 11:24:34 +08:00 via Android
    @Trinity888 快不起来,考试视频动不动几十分钟,cpu 转码速度太慢了,甚至可能 0.几倍的速度,转一个花半小时以上太夸张,除非调用硬件加速试试,但客户端硬件配置不能被你们控制的话会带来一堆问题。
    服务器转码也不是不行,但也太烧时间和算力了。

    还是尝试一下魔改播放器同时播放吧,要控制俩视频同步播放,应该有解决方案的
    love
        20
    love  
       2020-10-18 11:29:11 +08:00
    @laminux29 不要误导人,就楼主这种情况很可能是可以直接 append 的,而 ffmpeg 也有这类功能。
    我平时也做视频编辑,把一个文件的视频剪几段下来,再拼回一个新文件,中间并不需要重编码。除非是压制参数不同的片段。
    Osk
        21
    Osk  
       2020-10-18 11:32:46 +08:00 via Android
    @love 楼主的可能是两个角度同时拍的考试视频,左右贴一起方便审查时回放,cat 合并的话,审查不方便了点
    u6pM63mMZ34z32cE
        22
    u6pM63mMZ34z32cE  
       2020-10-18 11:36:14 +08:00
    得加钱
    kokutou
        23
    kokutou  
       2020-10-18 11:40:28 +08:00   ❤️ 4
    直接原始视频提交上去啊...

    需要回放的时候做 2 个播放模块,左右一起播放就可以了啊..
    ayconanw
        24
    ayconanw  
       2020-10-18 11:47:47 +08:00   ❤️ 1
    按照楼主给的参数看,应该是要把视频画面拼在一起,而不是前后相连。建议提问时候描述的更清晰一些,你只写个合并,多数理解会认为是要时间上前后相连。

    画面拼一起的话,这就必须要重编码了,重编码想要速度快,2 个要素:
    1.编码硬件强( cpu 多核性能好或者高性能显卡编码)
    2.降低画质和压缩率(也就是增大压完之后视频文件的体积),这个就是看你编码参数怎么设置

    不过就算你用 x264 的 fast preset,再把分辨率降低到 480p 档次,想要压出勉强能看的画质,也需要不少的时间
    如果考试人数不是特别多的话,建议先上传服务器,然后在服务器上重编码
    11ze
        25
    11ze  
       2020-10-18 11:55:19 +08:00
    ffmpeg 支持多线程的, 加一下参数试试
    JerryCha
        26
    JerryCha  
       2020-10-18 12:17:14 +08:00
    如果你没有必须保留双视频的源文件的必要的话,左右拼接这件事情应该在录制的时候就处理好。
    reus
        27
    reus  
       2020-10-18 14:07:38 +08:00
    加钱就能解决,越有钱越快
    aru
        28
    aru  
       2020-10-18 14:14:15 +08:00
    合并快不了
    交卷的时候直接将两个原始视频上传吧,然后在服务器队列异步合并。
    aru
        29
    aru  
       2020-10-18 14:15:42 +08:00
    或者改一下播放器,审查的时候同时播放两个视频,这样就不需要合并了
    rund11
        30
    rund11  
       2020-10-18 15:16:36 +08:00 via Android
    本来就不应该客户端合并啊,客户端很多机器配置应该不高,而且合并也耗时间
    pjntt
        31
    pjntt  
       2020-10-18 16:40:12 +08:00
    先提交上去,让服务器排队处理。
    muzuiget
        32
    muzuiget  
       2020-10-18 16:47:55 +08:00
    这种画面左右相连肯定要重编码,再优化也快不了。所以换个思路,从播放端入手,同时同步播放两个视频就行了。
    zsdroid
        33
    zsdroid  
       2020-10-18 16:56:52 +08:00
    所以到底是同框,还是首尾拼接??
    hello2060
        34
    hello2060  
       2020-10-18 17:00:17 +08:00 via iPhone
    如果你们可以控制录像源码的话,第二个录像的开始时间设为第一个的结束时间就可以了。
    具体参考 HLS 产生单个视频文件的要求。然后生成一个 m3u8 文件直接播放他就行了。

    不过这么做有点小题大做了
    Trinity888
        35
    Trinity888  
    OP
       2020-10-18 17:18:20 +08:00
    我是提问者,不好意思,小弟在描述问题时没说清楚:我这两个视频是要拼接在一个画面中,是要对比看,所以要拼接。不是首尾合在一起。
    Trinity888
        36
    Trinity888  
    OP
       2020-10-18 17:21:29 +08:00
    @ayconanw 谢谢您给小弟的建议,我确实是要将两视频画面,拼在一起。
    Trinity888
        37
    Trinity888  
    OP
       2020-10-18 17:21:55 +08:00
    @zsdroid 同框
    weiming
        38
    weiming  
       2020-10-18 17:35:32 +08:00
    随便来个显卡就可以提高 10 倍以上的速度
    rosu
        39
    rosu  
       2020-10-18 17:41:09 +08:00 via Android
    异步队列,或者播放时前端处理。只是后者无法解决下载观看问题。
    feedcode
        40
    feedcode  
       2020-10-18 17:53:35 +08:00   ❤️ 2
    服务端处理+新版 FFMPEG hstack
    https://ffmpeg.org/ffmpeg-filters.html#hstack
    Stack input videos horizontally.
    All streams must be of same pixel format and of same height.
    Note that this filter is faster than using overlay and pad filter to create same output.

    ```
    ffmpeg -i a.mp4 -i b.mp4 -filter_complex vstack output.mp4
    ```
    feedcode
        41
    feedcode  
       2020-10-18 17:58:18 +08:00
    ffmpeg -i a.mp4 -i b.mp4 -filter_complex hstack output.mp4
    laqow
        42
    laqow  
       2020-10-18 18:07:23 +08:00 via Android
    录的时候在线合是 1x 的速度,提交的时候合是几十 x 的速度
    expy
        43
    expy  
       2020-10-18 20:15:39 +08:00
    改下录制程序吧,原始流先别编码,处理成一个之后再编码。
    Lemeng
        44
    Lemeng  
       2020-10-18 20:44:50 +08:00
    合并的有很多,有些付费的不错,以前用过一个软件一月的 vip,只是太贵,用不起
    youxiachai
        45
    youxiachai  
       2020-10-18 21:24:19 +08:00 via iPad
    重编码怎么可能快。。。。
    JerryV2
        46
    JerryV2  
       2020-10-18 21:34:13 +08:00
    @expy
    赞同,录制的时候就处理成一个视频,边录边拼
    dlllcs
        47
    dlllcs  
       2020-10-18 22:57:05 +08:00
    总结:

    上策:
    @expy 录制的时候就处理成一个视频,边录边拼
    中策:@feedcode 使用 hstack 新特性,会比重新编码快很多
    下策:
    dlllcs
        48
    dlllcs  
       2020-10-18 22:57:59 +08:00
    总结:

    上策:
    1. @expy 录制的时候就处理成一个视频,边录边拼
    2. @Osk 播放器同时播放吧,要控制俩视频同步播放
    中策:@feedcode 使用 hstack 新特性,会比重新编码快很多
    royzxq
        49
    royzxq  
       2020-10-18 23:48:02 +08:00
    学到了... 之前都拿 CPU 硬转, 刚才拿硬件加速试了一下, 0.3x -> 2x
    expy
        50
    expy  
       2020-10-19 08:44:24 +08:00
    还有质量要求不高的监控可以考虑砍帧率分辨率降低编码器参数,
    搞个 480p 10fps x264 预设 veryfast 计算量会小很多。
    doyel
        51
    doyel  
       2020-10-19 09:22:09 +08:00
    需求里没有说要重编码,直接 copy 拼接不就完了。。。
    newmlp
        52
    newmlp  
       2020-10-19 09:39:03 +08:00
    可以录的时候就拼好啊
    RangerWolf
        53
    RangerWolf  
       2020-10-19 11:25:14 +08:00
    至少可以使用 intel cpu 的核心显卡,实测过,这个速度是纯 cpu 的 150%
    qianlige
        54
    qianlige  
       2020-10-19 15:40:53 +08:00
    做个同时播放的功能吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1259 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:54 · PVG 01:54 · LAX 09:54 · JFK 12:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.