On 3/2/26 16:42, Bruce Roberts via ffmpeg-user wrote:
Hi there,

I'm generating hls streams with ffmpeg and I want to set the first frame of
video for all streams with a static pts. This can be zero or anything else,
as long as it's the same value for all streams. But my attempts to use the
setpts/asetpts filters to achieve this haven't been successful.

Here is my command:

ffmpeg -y -v info \
-ss 00:00:00.000 -t 00:00:05.000 -i /input/input.mxf \
-filter_complex \
"[0:v:0][0:a:0][0:a:1][0:a:2][0:a:3][0:a:4][0:a:5][0:a:6][0:a:7]concat=n=1:v=1:a=8[vconcat][aconcat0][aconcat1][aconcat2][aconcat3][aconcat4][aconcat5][aconcat6][aconcat7];
\
[aconcat6][aconcat7]join=inputs=2:channel_layout=stereo[t7_8]; \
[aconcat4][aconcat5]join=inputs=2:channel_layout=stereo[t5_6]; \
[aconcat2][aconcat3]join=inputs=2:channel_layout=stereo[t3_4]; \
[aconcat0][aconcat1]join=inputs=2:channel_layout=stereo[t1_2]; \
[t7_8]asetpts=PTS-STARTPTS[t7_8setpts]; \
[t5_6]asetpts=PTS-STARTPTS[t5_6setpts]; \
[t3_4]asetpts=PTS-STARTPTS[t3_4setpts]; \
[t1_2]asetpts=PTS-STARTPTS[t1_2setpts]; \
[vconcat]format=pix_fmts=yuv420p[vconcat420]; \
[vconcat420]yadif=0:-1:0[vconcatdeint];
[vconcatdeint]setpts=PTS-STARTPTS[vconcatdeintsetpts]" \
-map "[t7_8setpts]" -f hls -hls_list_size 0 -hls_time 3.84 -vn -acodec
libfdk_aac /output/TEST01_T4_Audio.m3u8 \
-map "[t5_6setpts]" -f hls -hls_list_size 0 -hls_time 3.84 -vn -acodec
libfdk_aac /output/TEST01_T3_Audio.m3u8 \
-map "[t3_4setpts]" -f hls -hls_list_size 0 -hls_time 3.84 -vn -acodec
libfdk_aac /output/TEST01_T2_Audio.m3u8 \
-map "[t1_2setpts]" -f hls -hls_list_size 0 -hls_time 3.84 -vn -acodec
libfdk_aac /output/TEST01_T1_Audio.m3u8 \
-map "[vconcatdeintsetpts]" -f hls -hls_list_size 0 -hls_time 3.84 -an
-vcodec libx264 -aspect 16:9 -flags +cgop -g 48 -bf 0 -b:v 2M -maxrate 3M
-x264opts keyint=48:min-keyint=48:scenecut=-1 \
/output/TEST01_T0_Video.m3u8

I'm expecting the pts of the first output video frame to be 0.

So my questions are please:

1. Why isn't the setpts filter working as I expect it to?
2. Why does the pts of the first frame default to 126000?
3. Given that a consistent pts value of 126000 would work fine for me, as
long as I can be confident that it will never be anything else, can I rely
on the first frame pts always being 126000 if I omit the pts filter
altogether?

1. The documentation for (a)setpts is: "Change the PTS (presentation timestamp) of the input frames.".
This is rather a syncing tool, and anyway not what you are looking for.

https://ffmpeg.org/ffmpeg-filters.html#setpts_002c-asetpts

Note that the default (unless using -copyts) is to "remove the initial start time offset value." (see copyts documentation) : you don't have to care about it.

2. In general, there are tricks that makes this "first frame pts" not so easy, but here it seems your use case is quite straightforward.

The issue is that you use the default hls output format, which is the legacy mpegts format : this is originally a transport protocol handling buffering etc. and thus deals with absolute timestamps, there is no explicit "starts here"/origin. This is why apple requires this value to be made explicit in their protocol: it is required to sync with an external subtitle file etc., and maybe you are indeed interested in the "first video frame pts" for this purpose.

Currently, the first pcr (clock timestamp) is set to the ffmpeg's muxdelay and the dts are shifted by the muxdelay. The current muxdelay is 0.7 second and the ts timebase is 90k. So, 2*0.7*90000 = 126000, indeed. But this is not documented (cannot be), and I don't recommand you to tweak the muxdelay to get a consistent output.

3. There is also a "mpegts_copyts" option, but I really can't recommand it. I don't know its use case, but I have tried it brievly and it leads to a pcr wrap at file start, which sounds weird.

Best is to use the fmp4 format. It is supported for a long time in iOS, so unless targeting a very specific ancient model, I assume there should not be any compatibility issue.

Otherwise, you can simply check each new ffmpeg release you want to use to make sure your 126000 has not changed... And, if ever required (not very likely), you could still use the -muxdelay parameter to get this value again.

Nicolas

_______________________________________________
ffmpeg-user mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to