[FFmpeg-user] Is there a way to set 'closed_gop' in FFmpeg?

Paul B Mahol onemda at gmail.com
Tue Jun 4 15:04:01 EEST 2024


On Mon, Jun 3, 2024 at 7:19 PM Mark Filipak <markfilipak.imdb at gmail.com>
wrote:

> With something a complicated as this stuff, I knew I would screw up
> something. Correction: I fixed
> the 'Commands used'.
>
>
> Hey,
>
> My cuts are perfect, true IDR. The join is perfect, yet MPV stalls for
> about 1/2 second and shows
> one, maybe two black frames. The only thing I can think of that would
> screw up the playing across my
> joins is MPEG's 'closed_gop' flag. It needs to set it to '1' for the GOP
> on the early side of the join.
>
> I know that FFmpeg doesn't fix 'closed_gop' when it does '-ss' and '-to'
> on VOBs, so I assume it
> doesn't fix 'closed_gop' for M2TSes either. Just for clarity, I'm not
> using '-ss' and '-to'. I'm
> doing stream editing instead -- see the end matter, below.
>
> Is there a way to set 'closed_gop' in FFmpeg?
> Is there a way to set 'closed_gop' for an individual GOP?
>
> Aside: I'm pretty sure this has something to do with '-ss' and '-to'
> sometimes failing to make
> segments that join properly. '-ss' and '-to' need to fiddle with the
> 'closed_gop' & 'broken_link'
> MPEG tags.
>
> Thanks!
> --Mark.
>
>
> Commands used:
>
> ffmpeg -copyts -i SOURCE_1 -map 0 -bsf
> noise=drop='lt(pts\,<I1_PTS>)+gte(dts\,<B_DTS>)',setts=dts='if(eq(DTS\,<I1_DTS>)\,<I1_PTS>-<1_frame>\,DTS)':pts='if(eq(PTS\,<I2_PTS>)\,<B_DTS>\,PTS)'
>
> -c copy -muxdelay 0 SEGMENT_1
>
> ffmpeg -copyts -i SOURCE_2 -map 0 -bsf
> noise=drop='lt(pts\,<I1_PTS>)+gte(dts\,<B_DTS>)',setts=dts='if(eq(DTS\,<I1_DTS>)\,<I1_PTS>-<1_frame>+<OFFSET>\,DTS+<OFFSET>)':pts='if(eq(PTS\,<I2_PTS>+<OFFSET>)\,<B_DTS>+<OFFSET>\,PTS+<OFFSET>)'
>
> -c copy -muxdelay 0 SEGMENT_2
>
> ffmpeg -copyts -i "concat:SEGMENT_1|SEGMENT_2" -map 0 -c copy -muxdelay 0
> TARGET
>
> (Paul, I don't think concat is a problem. I think this stuff, here, is the
> problem.)
>
> Step 1: Make IDR cuts
> SEGMENT_1 -- imagine i want just just one gop having only 6 frames
> (source is all open GOPs)
>                          I1_PTS                     I2_PTS
>                                \<———6 frames———>   /
> PTS order    .. B  B  P  B  B  I  B  B  P  B  B  I  B  B  P ..
>                 _¦__¦_/  _¦__¦_/  _¦__¦_/  _¦__¦_/  _¦__¦_/
>                / ¦  ¦   / ¦  ¦   / ¦  ¦   / ¦  ¦   / ¦  ¦
> DTS order .. P  B  B  I  B  B  P  B  B  I  B  B  P  B  B ..
>                         \                       \
>                          I1_DTS                  B_DTS
>
> CUT pts < I1_PTS               <———6 frames———>
> CUT dts >= B_DTS               I  B  B  P  B     I
>                          ______/  _¦__¦_/  _¦____/
>                         /        / ¦  ¦   / ¦
>                        I        P  B  B  I  B
>
> Note: If there was just one open B-frame, now there are no open B-frames.
> In that case (my case),
> the 6 frames are now a closed GOP and must be marked 'closed_gop = 1', but
> how do I do that?
>
> .-------------------------WHAT IS CUT--------------------------.
> ¦                              <———6 frames———>                ¦
> ¦            .. B  B  P  B  B                 B     B  B  P .. ¦
> ¦              _¦__¦_/   ¦  ¦                 ¦    _¦__¦_/     ¦
> ¦             / ¦  ¦     ¦  ¦                 ¦   / ¦  ¦       ¦
> ¦         .. P  B  B     B  B                 B  P  B  B ..    ¦
> '--------------------------------------------------------------'
>
> ADJUST DTS & PTS               <———6 frames———>
>                                 I  B  B  P  B  I<——
>                                /  _¦__¦_/  _¦_/
>                               /  / ¦  ¦   / ¦
>                        —————>I  P  B  B  I  B
>
> (The ending I-frame has replaced the final open B-frame -- preserves N &
> sync.)
>
>
> Step 2: Do the same and add OFFSET               <———6 frames———>
> SEGMENT_2                                        I  B  B  P  B  I
>                                                  /  _¦__¦_/  _¦_/
>                                                 /  / ¦  ¦   / ¦
>                                                I  P  B  B  I  B
>
>
> Step 3: Concatenate            <———6 frames———>  <———6 frames———>
>                                 I  B  B  P  B  I  I  B  B  P  B  I
>                                /  _¦__¦_/  _¦_/  /  _¦__¦_/  _¦_/
>                               /  / ¦  ¦   / ¦   /  / ¦  ¦   / ¦
>                              I  P  B  B  I  B  I  P  B  B  I  B
>
>
> ffmpeg -copyts -i "concat:SEGMENT_1|SEGMENT_2" -map 0 -c copy -muxdelay 0
> TARGET
>
> ffmpeg version 2024-05-20-git-127ded5078-full_build-www.gyan.dev
> Copyright (c) 2000-2024 the FFmpeg
> developers
>    built with gcc 13.2.0 (Rev5, Built by MSYS2 project)
>    configuration: --enable-gpl --enable-version3 --enable-static
> --disable-w32threads
> --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls
> --enable-libxml2
> --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib
> --enable-librist
> --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth
> --enable-libbluray
> --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption
> --enable-libdav1d
> --enable-libdavs2 --enable-libuavs3d --enable-libxevd --enable-libzvbi
> --enable-librav1e
> --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265
> --enable-libxavs2
> --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl
> --enable-libopenjpeg
> --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r
> --enable-libfreetype
> --enable-libfribidi --enable-libharfbuzz --enable-liblensfun
> --enable-libvidstab --enable-libvmaf
> --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid
> --enable-dxva2 --enable-d3d11va
> --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec
> --enable-nvenc --enable-vaapi
> --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl
> --enable-libcdio
> --enable-libgme --enable-libmodplug --enable-libopenmpt
> --enable-libopencore-amrwb
> --enable-libmp3lame --enable-libshine --enable-libtheora
> --enable-libtwolame --enable-libvo-amrwbenc
> --enable-libcodec2 --enable-libilbc --enable-libgsm
> --enable-libopencore-amrnb --enable-libopus
> --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b
> --enable-libflite
> --enable-libmysofa --enable-librubberband --enable-libsoxr
> --enable-chromaprint
>    libavutil      59. 19.100 / 59. 19.100
>    libavcodec     61.  5.104 / 61.  5.104
>    libavformat    61.  3.103 / 61.  3.103
>    libavdevice    61.  2.100 / 61.  2.100
>    libavfilter    10.  2.102 / 10.  2.102
>    libswscale      8.  2.100 /  8.  2.100
>    libswresample   5.  2.100 /  5.  2.100
>    libpostproc    58.  2.100 / 58.  2.100
> Input #0, mpegts, from 'concat:SEGMENT_1|SEGMENT_2':
>    Duration: 02:47:54.15, start: 31.712367, bitrate: 20859 kb/s
>    Program 1
>      Metadata:
>        service_name    : Service01
>        service_provider: FFmpeg
>    Stream #0:0[0x1011]: Video: h264 (High) ([27][0][0][0] / 0x001B),
> yuv420p(progressive), 1920x1080
> [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 90k tbn
>    Stream #0:1[0x1100]: Audio: dts (dca) (DTS-HD MA) ([130][0][0][0] /
> 0x0082), 48000 Hz, mono, s32p
> (24 bit)
> Stream mapping:
>    Stream #0:0 -> #0:0 (copy)
>    Stream #0:1 -> #0:1 (copy)
> Output #0, mpegts, to 'TARGET':
>    Metadata:
>      encoder         : Lavf61.3.103
>    Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B),
> yuv420p(progressive), 1920x1080 [SAR
> 1:1 DAR 16:9], q=2-31, 23.98 fps, 23.98 tbr, 90k tbn
>    Stream #0:1: Audio: dts (DTS-HD MA) ([130][0][0][0] / 0x0082), 48000
> Hz, mono, s32p (24 bit)
> [mpegts @ 00000000003c2c80] Packet corrupt (stream = 0, dts = NOPTS).
> [out#0/mpegts @ 00000000004a7400] video:23082127KiB audio:1345500KiB
> subtitle:0KiB other
> streams:0KiB global headers:0KiB muxing overhead: 5.013221%
> size=25652238KiB time=02:47:48.97
> bitrate=20870.4kbits/s speed=5.47x
>
>
> Note the line: "[mpegts @ 00000000003c2c80] Packet corrupt (stream = 0,
> dts = NOPTS)."
> Which packet? What PTS?
>
> Last Thought: Video is Legos.
>

Not possible, use something more efficient, less buggy and far more useful
tooling.


> _______________________________________________
> ffmpeg-user mailing list
> ffmpeg-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-user
>
> To unsubscribe, visit link above, or email
> ffmpeg-user-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-user mailing list