On Sunday, December 19, 2021, Terje J. Hanssen <terjejhanssen@gmail.com> wrote:


Den 19.12.2021 03:38, skrev Andrew Randrianasulu:


On Sunday, December 19, 2021, Terje J. Hanssen <terjejhanssen@gmail.com <mailto:terjejhanssen@gmail.com>> wrote:



    Den 19.12.2021 01:00, skrev Andrew Randrianasulu:


    On Sunday, December 19, 2021, Terje J. Hanssen
    <terjejhanssen@gmail.com <mailto:terjejhanssen@gmail.com>> wrote:


        [.......]




                                    ===============

                                    I-frame-only 50 Megabit MPEG-2 or
            comparable
                    DV50 in
                                4:2:2 as
                                    high-end, "visually lossless"
            intermediate
                    format for
                                archival and
                                    suited for editing?

                                    -----------------

                                    Regarding DV50, FFMpeg has a
            friendly "target
                    dv50"
                                support
                                    (similar as "target DVD"). So to
            get a first
                    look on a
                                DV50 test
                                    file, I simply transcoded
            422/10bit Video and PCM
                                audio from a MOV
                                    file (ProRes 422HQ) to a raw DV50
            (422/8bit) file:

                                        ffmpeg -i SD-MOV.mov -target
            pal-dv50
                    SD-DV50.dv

                                    [......]


                                    205M SD-DV50.dv (ffmpeg
            re-encoded/remuxed)
                    AV-info:

                                    avprobe SD-DV50.dv
                                    avprobe version 12.3, Copyright
            (c) 2007-2018 the
                                Libav developers
                                      built on Mar 26 2018 12:39 with
            gcc 11 (SUSE
                    Linux)
                                    [dv @ 0x55cdddb96440] Estimating
            duration from
                                bitrate, this may
                                    be inaccurate
                                    Input #0, dv, from 'SD-DV50.dv':
                                      Metadata:
                                        timecode        : 00:00:00:00
                                      Duration: 00:00:29.80, start:
            0.000000, bitrate:
                                57600 kb/s
                                      Stream #0:0: Video: dvvideo,
            yuv422p,
                    720x576 [SAR
                                16:15 DAR
                                    4:3], 25000 kb/s, 25 fps, 25 tbr,
            25 tbn, 25 tbc
                                      Stream #0:1: Audio: pcm_s16le,
            48000 Hz, stereo,
                                s16, 1536 kb/s
                                      Stream #0:2: Audio: pcm_s16le,
            48000 Hz, stereo,
                                s16, 1536 kb/s
                                    # avprobe output

                                    ===================

                                    As seen above, it looks like
            ffmpeg produced wrong
                                meta data for
                                    the DV50 video bitrate (25
            Mb/s=DV25), while
                    the total
                                bitrate
                                    57.6 Mb/s is correct. (Also
            similar was seen with
                                ffprobe and
                                    Mediainfo).

                                    My VLC player or Gnome
            movieplayer did not
                    playback
                                the DV50 file,
                                    while ffplay did (as usual
            without audio?).

                                    Cin-GG miss a DV50 preset among
            format setting.
                                However DV50 else
                                    loades preliminary OK in Cin-GG
            (via ffmpeg).


                                I'll look at dv50 output preset..

                            Fine

                        ===============

                        I tried also to transcode and remux 422 Video
            and PCM
                    Audio to a
                        50 Mbps MPEG-2 I-frame only program stream.

                        1) MPG From MOV (ProRes 422HQ)
                        ------------------------------

                        ffmpeg -i SD-MOV.mov -c:v mpeg2video -bf 2
            -b:v 50M
                    -maxrate 50M
                        -minrate 50M -c:a pcm_s16be -f vob SD-MP2I-50.mpg
                        [....]
                        Stream mapping:
                          Stream #0:0 -> #0:0 (prores (native) ->
            mpeg2video (native))
                          Stream #0:1 -> #0:1 (pcm_s24le (native) ->
            pcm_s16be
                    (native))
                        Press [q] to stop, [?] for help
                        [mpeg2video @ 0x560ffd164ec0] Automatically
            choosing VBV
                    buffer
                        size of 746 kbyte
                        [vob @ 0x560ffd14d180] At most 8 channels
            allowed for LPCM
                    streams.
                        Could not write header for output file #0
            (incorrect codec
                        parameters ?): Invalid argument
                        Error initializing output stream 0:1 --

                        ***This failed because PreRes Audio uses 16
            channels:***


                    yeah... interesting limitation.. and interesting
            number of
                    channels..


                        ffprobe SD-MOV.mov 2>&1 >/dev/null | grep
            Stream.*Audio
                          Stream #0:1(eng): Audio: pcm_s24le (lpcm /
            0x6D63706C),
                    48000
                        Hz, 16 channels, s32 (24 bit), 18432 kb/s
            (default)


                        2) MPG from DV50
                        ----------------
                        ffmpeg -i SD-DV50.dv -c:v mpeg2video -bf 2
            -b:v 50M
                    -maxrate 50M
                        -minrate 50M -c:a pcm_s16be -f vob SD-MP2I-50.mpg

                        du -sh *
                        205M    SD-DV50.dv
                        284M    SD-MOV.mov
                        186M    SD-MP2I-50.mpg

                        avprobe SD-MP2I-50.mpg
                        Input #0, mpeg, from 'SD-MP2I-50.mpg':
                          Duration: 00:00:29.77, start: 0.540000,
            bitrate: 52167 kb/s
                            Stream #0:0[0x1e0]: Video: mpeg2video
            (4:2:2), yuv422p(tv,
                        progressive), 720x576 [SAR 16:15 DAR 4:3],
            50000 kb/s, 25
                    fps, 25
                        tbr, 90k tbn, 50 tbc
                            Stream #0:1[0xa0]: Audio: pcm_dvd, 48000
            Hz, 2
                    channels, s16,
                        1536 kb/s

                        ***** The SD-MP2I-50.mpg file size is here
            90% of DV50
                    ********

                        The SD-MP2I-50.mpg playback ok with VLC,
            Gnome movieplayer,
                        ffplay, and loads and playback in Cin-GG
                        The audio volume seems low (weak), but can
            probably be
                    adjusted
                        higher with ffmpeg


                    well, but I missed keyframe parameter? bitrate is
            big but I
                    think without special param ffmpeg still will not
            make all-I
                    mpeg2 stream..?



                The first Video part of my ffmpeg script was based on
            this
                standard FFmpeg Howto for
                "MPEG-2 I-frame only Highest Quality Encoding", which
            didn't
                include a keyframe parameter !?
            https://brunosan.eu/images/ffmpeg_howto.html#Encoding_MPEG-2_I-frame_only_in_Highest_Quality
            <https://brunosan.eu/images/ffmpeg_howto.html#Encoding_MPEG-2_I-frame_only_in_Highest_Quality>
               
            <https://brunosan.eu/images/ffmpeg_howto.html#Encoding_MPEG-2_I-frame_only_in_Highest_Quality
            <https://brunosan.eu/images/ffmpeg_howto.html#Encoding_MPEG-2_I-frame_only_in_Highest_Quality>>

                ffmpeg -i <input_file> -vcodec mpeg2video -pix_fmt
            yuv422p -qscale
                1 -qmin 1 -intra -an output.m2v


            you missed

            -intra?


        Thanks for reviewing. "-intra" should definitely be there,
        and I know I used it before editing and troubleshooting the
        audiopart, removing -an. Cleaned up and added also some other
        parameters
        -q:v 1 -qmin 1 -intra


        3) MP2I50 from DV50:
        ---------------------
        ffmpeg -i SD-DV50.dv -c:v mpeg2video -q:v 1 -qmin 1 -intra
        -bf 2 -b:v 50M -maxrate 50M -minrate 50M -c:a pcm_s16be -f
        vob SD-MP2I50.mpg
        [...]
        Input #0, dv, from 'SD-DV50.dv':
          Metadata:
            timecode        : 00:00:00:00
          Duration: 00:00:29.80, start: 0.000000, bitrate: 57600 kb/s
          Stream #0:0: Video: dvvideo, yuv422p, 720x576 [SAR 16:15
        DAR 4:3], 25000 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc
          Stream #0:1: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
          Stream #0:2: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
        [... a lot of vob buffer messages scrolling ....]
        [vob @ 0x564dbf6a0680] packet too large, ignoring buffer
        limits to mux it
        [vob @ 0x564dbf6a0680] buffer underflow st=1 bufi=7204 size=7680
        frame=  745 fps=460 q=1.0 Lsize=  189584kB time=00:00:29.76
        bitrate=52186.6kbits/s speed=18.4x
        video:181698kB audio:5588kB subtitle:0kB other streams:0kB
        global headers:0kB muxing overhead: 1.227127%

        avprobe SD-MP2I50.mpg
        avprobe version 12.3, Copyright (c) 2007-2018 the Libav
        developers
          built on Mar 26 2018 12:39 with gcc 7 (SUSE Linux)
        Input #0, mpeg, from 'SD-MP2I50.mpg':
          Duration: 00:00:29.80, start: 0.540000, bitrate: 52116 kb/s
            Stream #0:0[0x1e0]: Video: mpeg2video (4:2:2),
        yuv422p(tv, progressive), 720x576 [SAR 16:15 DAR 4:3], 50000
        kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
            Stream #0:1[0xa0]: Audio: pcm_dvd, 48000 Hz, 2 channels,
        s16, 1536 kb/s

        ================

        (Re)tested also with

        4) No intra (-intra)
        ffmpeg -i SD-DV50.dv -c:v mpeg2video -bf 2 -b:v 50M -maxrate
        50M -minrate 50M -c:a pcm_s16be -f vob SD-MP2-50.mpg

        5) Without specified Video bitrate (-b:v)
        ffmpeg -i SD-DV50.dv -c:v mpeg2video -q:v 1 -qmin 1 -intra
        -bf 2 -c:a pcm_s16be -f vob SD-MP2I-.mpg

        6) Video only - no Audio (-an):
        ffmpeg -i SD-DV50.dv -vcodec mpeg2video -q:v 1 -qmin 1 -intra
        -an SD-MP2I50-an.m2v

        -----------------

        du -sh *
        284M    SD-MOV.mov
        205M    SD-DV50.dv
        186M    SD-MP2I50.mpg    (3)
        186M    SD-MP2-50.mpg    (4)
        153M    SD-MP2I-.mpg     (5)
        146M    SD-MP2I50-an.m2v (6)

        As seen, no size difference between -intra (3) and without
        intra flag specified (4) above:
        186/205 = 90% size of the input SD-DV50.dv

        I would expect this due to high bitrate and some more
        effectiv video compression for MPEG-2 over DV50.
        While the consumer DV25/4:2:0 pal uses 5:1 intra compression,
        the pro(sumer) DV50/4:2:2 uses lower 3.3:1.

        -------------

        7) Another, equivalent SD MPEG-2/ 422P@ML option to setup for
        Cin-GG/ FFMpeg preset could be:

        D10 aka Sony IMX50 Encoding - a standard definition
        professional video recording format. Uses intraframe
        compression, 4:2:2 color subsampling and user-selectable
        constant video data rate of 30, 40 or 50 Mbit/s.

        422P@ML  720 × 576 25 FPS 4:2:2 Sampling 50 Mbits/s
        Sony IMX50 (I only), Broadcast Contribution (I&P only)

        The Howto contains both a short and a long script version.

        ----------------


            ffmpeg changes cmd line and API quickly.. (

            try "-g 1" and check keyframes with some linevlike those?

            https://snippets.bentasker.co.uk/page-1707191206-Get-Video-Keyframe-Interval-(ffprobe)-BASH.html
            <https://snippets.bentasker.co.uk/page-1707191206-Get-Video-Keyframe-Interval-(ffprobe)-BASH.html>
            <https://snippets.bentasker.co.uk/page-1707191206-Get-Video-Keyframe-Interval-(ffprobe)-BASH.html
            <https://snippets.bentasker.co.uk/page-1707191206-Get-Video-Keyframe-Interval-(ffprobe)-BASH.html>>


        I tried to copy and paste some line from the manual url, but
        If you possibly can setup an exact FF syntax to run here, I
        can do it ;)


    attached copy of script Phyllis send to me back in 2019


    Sorry I'm not skilled with sed scripts. "Somewhere" I would expect
    my encoded file name "SD-MP2I50.mpg" should be put in to be read
    and analyzed with ffprobe? And what about the first mentioned "-g 1" ?


try to run script like this (after chmod +x on it) :


$ ./kfrm.sh vid_20210526.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'vid_20210526.mp4':
  Metadata:
    major_brand : isom
    minor_version : 512
    compatible_brands: isomiso2avc1mp41
    encoder : Lavf58.76.100
  Duration: 00:00:36.64, start: 0.000000, bitrate: 1314 kb/s
  Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, unknown/bt470bg/unknown), 640x480 [SAR 27:64 DAR 9:16], 1217 kb/s, 29.58 fps, 29.58 tbr, 11360 tbn, 59.17 tbc (default)
    Metadata:
      handler_name : VideoHandle
      vendor_id : [0][0][0][0]
  Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 90 kb/s (default)
    Metadata:
      handler_name : SoundHandle
      vendor_id : [0][0][0][0]
key_frame=1
key_frame=0
key_frame=0


for all I frames it should output key_frame=1 for all (many!) frames.

you can add ' | grep 0' at the end of this line and see how many non-keyframes it will find.

-g is ffmpeg parameter setting distance between keyframes.



    What are we really searching for or verify in this I-frame only
    encoded MPEG-2 video file ?


yes we try to verify it really all-I frames file. (impact seekability among other things)



    And isn't keyframes another (previous?) name for Intra-frames?


yes, as far as I know.



Thanks, script testrun executed with attached output here.
    Test-run_Intra-frame_key_word

As seen below from the summary table, all files except the MPEG-2 generated "SD-MP2-50.mpg" without the ffmpeg -intra flag set, contains all Intra-frames only:

-------------------------------------------------------
du -sh SD*.*            # key_frame=1    # key_frame=0
                (# I-frames)    (# non-I-frames)
284M    SD-MOV.mov            746        0
205M    SD-DV50.dv            745        0
186M    SD-MP2I50.mpg            745        0
153M    SD-MP2I-.mpg            745        0
186M    SD-MP2-50.mpg             63        682
146M    SD-MP2I50-an.m2v        745        0

good! 

but a bit concerned 746 vs 745 frame count. Are we losing one frame somewhere? 

Counts matched # key_frame=1 (I-frames)
./kfrm.sh SD-MOV.mov | grep -c key_frame=1

Counts other (unmatched) than key_frame=1
./kfrm.sh SD-MOV.mov | grep -v -c key_frame=1

--------------------------------------------------------