ffmpeg 精准切割视频优化相关的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zzfer
V2EX    FFmpeg

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

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

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

    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 -code 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  
       2024-07-05 23:30:36 +08:00
    先精确后粗略,这个方法太麻烦了。

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

    有精确切割需求的话,直接用一个长指令,让他一条龙生成多个片段。这样速度会快许多,缺点是指令有最大长度的限制。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2716 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 08:30 PVG 16:30 LAX 01:30 JFK 04:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86