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

ffmpeg 精准切割视频优化相关的问题

  •  
  •   zzfer · 2021-10-15 18:52:46 +08:00 · 4971 次点击
    这是一个创建于 1164 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要非常精准,且不会出现帧数丢失,是否只能转码切割?执行的命令如下

    ffmpeg -ss -start -accurate_seek -i -videoPath -preset ultrafast -t -3600 -c:v libx264 -c:a aac -strict experimental -resultPath -y
    

    查了好多这种是唯一符合要求的切割方法,但是速度很慢,想问问有没有大佬可以优化的地方

    17 条回复    2024-07-05 23:30:36 +08:00
    flyhaozi
        1
    flyhaozi  
       2021-10-15 18:56:18 +08:00
    可以先无损粗切,然后再转码精准切割,应该能省点时间?
    rosu
        2
    rosu  
       2021-10-15 19:24:06 +08:00 via iPhone   ❤️ 1
    最精确查找是要逐帧解码的,ss 也应该应用到输出文件(-i 参数值之后)。
    又要快又要准,可以先 ss 在输入前指定位置,再 ss 指定输入后的位置…

    参考官方文档: https://trac.ffmpeg.org/wiki/Seeking
    mxT52CRuqR6o5
        3
    mxT52CRuqR6o5  
       2021-10-15 19:47:10 +08:00 via Android
    把丢失的那几帧进行转码切割然后拼起来,有没有可行性?
    ch2
        4
    ch2  
       2021-10-15 19:53:04 +08:00   ❤️ 1
    粗剪就行了吧
    ffmpeg -ss START -to END -i YOUR_FILE_NAME.mp4 -codec copy -avoid_negative_ts 1 OUTPUT.mp4
    msg7086
        5
    msg7086  
       2021-10-15 21:24:04 +08:00
    > 是否只能转码切割?

    是的。每个 GOP 是一个整体,没办法直接无损切开。
    wszgrcy
        6
    wszgrcy  
       2021-10-15 22:06:33 +08:00
    是的,我记得去年我也问过,参数加前面才能正常切,但是速度降下来了,再后面的是会找最近的关键帧好像是
    AX5N
        7
    AX5N  
       2021-10-15 23:54:47 +08:00
    是的,必须转码
    LeeReamond
        8
    LeeReamond  
       2021-10-16 04:46:49 +08:00
    @msg7086 这么说的话特定情况下能否实现无损?原编码每个 GOP 独立且恰好切割 GOP 帧数
    msg7086
        9
    msg7086  
       2021-10-16 08:26:41 +08:00
    @LeeReamond 如果正好切在 GOP 上的话当然没问题。
    实际上,非精准切割就是切在 GOP 边界上。

    PS: 音频其实也有自己的「 GOP 」,只不过音频的帧比较小,所以切割的时候不会距离太远。
    比如 AAC 在 48khz 下一个帧长 21.3ms ,这 21.3ms 也是没法切开的。
    LeeReamond
        10
    LeeReamond  
       2021-10-17 00:19:12 +08:00
    @msg7086 所以按大佬所说 ffmpeg 的处理方式是,如果遇到非封闭 gop 就编码,而后续如果 gop 是完整的话就直接复制?我比较好奇因为我印象中用 ffmpeg 切割视频是没有转码时间的,基本一个复制文件的时间就结束了
    msg7086
        11
    msg7086  
       2021-10-17 03:32:13 +08:00   ❤️ 1
    @LeeReamond ffmpeg 切割既可以重编码也可以复制流,看你怎么写参数。
    复制流就只能切 GOP 边界,重编码则是精确切割但是全部重编码。
    如果你 ss to 写在输入前面,然后编码用 copy,就是复制流。
    如果你 ss to 写在输出前面,然后编码用 x264,那就是重编码成 x264 。
    (应该没有记错吧。)

    GOP 是很难去凑参数单独重编码的,除非你知道原始编码器用的参数,然后用一样的参数去重编码不完整的 GOP,否则后续 GOP 可能会因为参数不同而花屏。
    ameccc
        12
    ameccc  
       2021-10-17 22:03:09 +08:00
    之前用过的方法是先多提前一点 copy,然后在新的文件里找到第一个关键帧,再剪到第一帧。不过有的时候会留下一些不需要的内容。
    zzfer
        13
    zzfer  
    OP
       2021-10-18 10:31:37 +08:00
    @flyhaozi 你是说先无损粗切出来一个视频,然后再完整的将这个视频再执行转码切割吗?


    @mxT52CRuqR6o5 尝试过分段切割再拼接起来,但拼接部分会有一秒左右的卡顿


    @ch2 这个试过,速度确实很快,但切割的开始时间恰好是关键帧还没啥问题,如果不是,开头会出现黑屏或者空白屏
    linhui9018
        14
    linhui9018  
       2022-04-13 15:23:53 +08:00
    https://trac.ffmpeg.org/wiki/Concatenate

    ffmpeg -ss 00:03:00 -i video.mp4 -t 60 -c copy -avoid_negative_ts 1 cut.mp4
    zzfer
        15
    zzfer  
    OP
       2022-04-13 17:41:25 +08:00
    @linhui9018 感谢回复,但这个试过了,如果开头或者结尾是关键帧,那么是好用的,不然开头或结尾会有黑屏或者空白屏。
    zzfer
        16
    zzfer  
    OP
       2022-04-13 17:43:33 +08:00
    @linhui9018 现在回想起来,除了转码精准切割,还可以在你说的方法将开始时间和结束时间扩大 30 秒后切割,之后再转码精准切割,可能快一点
    ko1haha
        17
    ko1haha  
       169 天前
    先精确后粗略,这个方法太麻烦了。

    我选择没有需求的时候就粗略切割合并。( 确实拼接的部分,片源不好的话会卡顿 1 秒。

    有精确切割需求的话,直接用一个长指令,让他一条龙生成多个片段。这样速度会快许多,缺点是指令有最大长度的限制。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2718 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:27 · PVG 19:27 · LAX 03:27 · JFK 06:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.