[FFmpeg-user] why are my streams not aligned?

Dennis Mungai dmngaie at gmail.com
Mon Nov 18 17:48:46 EET 2019


On Mon, 18 Nov 2019, 18:44 Dennis Mungai, <dmngaie at gmail.com> wrote:

>
>
> On Mon, 18 Nov 2019, 18:38 gordon, <wgordonw1 at gmail.com> wrote:
>
>> Okay, thank you. I will give that a go.
>>
>> -- aside --
>>
>> I thought that the "-force_key_frames expr:gte(t,n_forced*2)" was placing
>> the key frames for segment boundaries and still allowing the encoder to
>> place other keyframes where they wanted?  I am trying to use h264, h265,
>> and vp9 so I figured the keyframes not at boundaries would need to be
>> different for efficiency.
>>
>> How do I determine the best (or good) value for "-g" given a particular
>> source file and target duration for segments?
>>
>> On Mon, Nov 18, 2019 at 10:19 AM Dennis Mungai <dmngaie at gmail.com> wrote:
>>
>> > On Mon, 18 Nov 2019 at 17:31, gordon <wgordonw1 at gmail.com> wrote:
>> >
>> > > Why are the segments for my stream not aligned?  The first command
>> > outputs
>> > > video segment.  The second command outputs an audio segment with the
>> > > previous video output copied in.
>> > >
>> > > Ffmpeg commands are pasted below with the m3u8 outputs.  The same
>> results
>> > > were observed on ffmpeg 4.2.1 and snapshot
>> > >
>> > > /usr/local/bin/ffmpeg -y -loglevel error -f rawvideo -vcodec rawvideo
>> -s
>> > > 160x120 -pix_fmt rgb24 -r 12.00 -i - -an -vcodec libx264 -preset
>> medium
>> > -f
>> > > hls -an -hls_flags single_file -hls_time 6 -hls_list_size 0
>> > > -hls_segment_type mpegts -hls_segment_filename
>> > >
>> > >
>> >
>> /tmp/973b7b02b6e6486f90d3064527a69701/output/21b79578a1d04533932e32d28f46eb94.ts
>> > > -hls_playlist_type vod -master_pl_name
>> > > 21b79578a1d04533932e32d28f46eb94-master.m3u8 -force_key_frames
>> > > 'expr:gte(t,n_forced*2)' -profile:v baseline -level 3.0 -pix_fmt
>> yuv420p
>> > > -vsync cfr -b 145k -pix_fmt yuv420p
>> > >
>> > >
>> >
>> /tmp/973b7b02b6e6486f90d3064527a69701/output/21b79578a1d04533932e32d28f46eb94-variant.m3u8
>> > >
>> > > #EXTM3U
>> > > #EXT-X-VERSION:4
>> > > #EXT-X-TARGETDURATION:6
>> > > #EXT-X-MEDIA-SEQUENCE:0
>> > > #EXT-X-PLAYLIST-TYPE:VOD
>> > > #EXTINF:6.000000,
>> > > #EXT-X-BYTERANGE:116748 at 0
>> > > 21b79578a1d04533932e32d28f46eb94.ts
>> > > #EXTINF:6.000000,
>> > > #EXT-X-BYTERANGE:96256 at 116748
>> > > 21b79578a1d04533932e32d28f46eb94.ts
>> > > #EXTINF:6.000000,
>> > > #EXT-X-BYTERANGE:143256 at 213004
>> > > 21b79578a1d04533932e32d28f46eb94.ts
>> > > #EXTINF:6.000000,
>> > > #EXT-X-BYTERANGE:97760 at 356260
>> > > 21b79578a1d04533932e32d28f46eb94.ts
>> > > #EXTINF:5.750000,
>> > > #EXT-X-BYTERANGE:75764 at 454020
>> > > 21b79578a1d04533932e32d28f46eb94.ts
>> > > #EXT-X-ENDLIST
>> > >
>> > >
>> > > /usr/local/bin/ffmpeg -y -loglevel error -f s16le -acodec pcm_s16le
>> -ar
>> > > 44100 -ac 2 -i - -i
>> > >
>> > >
>> >
>> /tmp/973b7b02b6e6486f90d3064527a69701/output/21b79578a1d04533932e32d28f46eb94.ts
>> > > -vcodec copy -acodec libfdk_aac -ar 44100 -strict -2 -profile:a
>> aac_he_v2
>> > > -vbr 1 -f hls -hls_flags single_file -hls_time 6 -hls_list_size 0
>> > > -hls_segment_type mpegts -hls_segment_filename
>> > >
>> > >
>> >
>> /tmp/973b7b02b6e6486f90d3064527a69701/output/e3658a88388c4d4da25681956bccb00f.ts
>> > > -hls_playlist_type vod -master_pl_name
>> > > e3658a88388c4d4da25681956bccb00f-master.m3u8 -force_key_frames
>> > > 'expr:gte(t,n_forced*2)' -pix_fmt yuv420p -vsync cfr
>> > >
>> > >
>> >
>> /tmp/973b7b02b6e6486f90d3064527a69701/output/e3658a88388c4d4da25681956bccb00f-variant.m3u8
>> > >
>> > > #EXTM3U
>> > > #EXT-X-VERSION:4
>> > > #EXT-X-TARGETDURATION:6
>> > > #EXT-X-MEDIA-SEQUENCE:0
>> > > #EXT-X-PLAYLIST-TYPE:VOD
>> > > #EXTINF:6.000000,
>> > > #EXT-X-BYTERANGE:146452 at 0
>> > > e3658a88388c4d4da25681956bccb00f.ts
>> > > #EXTINF:6.000000,
>> > > #EXT-X-BYTERANGE:125020 at 146452
>> > > e3658a88388c4d4da25681956bccb00f.ts
>> > > #EXTINF:5.916667,
>> > > #EXT-X-BYTERANGE:167320 at 271472
>> > > e3658a88388c4d4da25681956bccb00f.ts
>> > > #EXTINF:6.083333,
>> > > #EXT-X-BYTERANGE:133856 at 438792
>> > > e3658a88388c4d4da25681956bccb00f.ts
>> > > #EXTINF:5.750000,
>> > > #EXT-X-BYTERANGE:103776 at 572648
>> > > e3658a88388c4d4da25681956bccb00f.ts
>> > > #EXT-X-ENDLIST
>> >
>> >
>> >
>> > To ensure alignment, you must use a closed GOP (set via -flags +cgop)
>> and
>> > specify a GOP size via the -g option passed to your video encoder.
>>
>>
>>
>
>
> A keyframe distance of 2 is ideal. Simply set -g to 2x your content's
>> frame rate. If your fps is 30, then -g should be 60. As an example.
>> Secondly, set your segment length to a multiple of 2. Segment lengths of 6
>> seconds are ideal (and it's what Apple recommends in their HLS authoring
>> guidelines). However, if low latency for a trade off in encoding quality is
>> desired, then set segment length to 2.
>
>
If you must force keyframes, then ensure that they are forced as IDRs.
libx264 should have that as a private encoder option, verify with ffmpeg -h
encoder=libx264.

Combining both -g and force key frames to the same interval is also ideal,
but be aware that forcing too many keyframes will invariably affect
transcode quality, as it may impact look ahead decisions, etc. Some
encoders, particularly libvpx are heavily affected by this quality
degradation with forcing keyframes. Evaluate what your requirements and
tradeoffs are and deploy them as needed.

>


More information about the ffmpeg-user mailing list