Opened 6 years ago

Closed 3 years ago

Last modified 4 weeks ago

#7485 closed defect (fixed)

HLS not accurately seeking on TS

Reported by: Louis Letourneau Owned by:
Priority: normal Component: avformat
Version: git-master Keywords: hls
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Summary of the bug:
Seeking accurately in HLS videos doens't work, but it
works fine in other containers (mp4, mkv, etc)

tried with ffmpeg version 3.4.4 and master f85fa100db7d35952

% ./ffmpeg version N-92147-gf85fa100db Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
configuration: --enable-libfreetype --enable-gpl --enable-libx264 --enable-libx265 --enable-nonfree --enable-libfdk-aac --enable-libopus --enable-libpulse --enable-libvpx --enable-openssl --enable-static
libavutil      56. 19.101 / 56. 19.101
libavcodec     58. 32.100 / 58. 32.100
libavformat    58. 18.104 / 58. 18.104
libavdevice    58.  4.105 / 58.  4.105
libavfilter     7. 33.100 /  7. 33.100
libswscale      5.  2.100 /  5.  2.100
libswresample   3.  2.100 /  3.  2.100
libpostproc    55.  2.100 / 55.  2.100

How to reproduce:
Create an HLS video like this

% mkdir a
% ./ffmpeg -y -s 640x480 -f rawvideo -pix_fmt rgb24 -r 25 -i /dev/zero -vf "drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeMono.ttf: text=%{n}: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x000000FF" -an -vcodec libx264 -preset medium -tune stillimage -crf 24 -pix_fmt yuv420p -shortest -force_key_frames "expr:gte(t,n_forced*5)" -bf 0 -hls_time 5 -hls_list_size 0 -hls_wrap 0 -hls_allow_cache 1 -hls_segment_filename "a/a_%04d.ts" -t 60 a/a.m3u8

And also create it's mp4 counterpart:

% ./ffmpeg -i a/a.m3u8 -codec copy a.mp4

And try to seek in any segment:

F=130;rm -f f.png;./ffmpeg -y -ss `awk "BEGIN {print (${F})/25}"` -i a/a.m3u8 -f image2 -q:v 1 -vframes 1 f.png
./ffplay f.png

Got frame 250 (bad)

F=126;rm -f f.png;./ffmpeg -y -ss `awk "BEGIN {print (${F})/25}"` -i a/a.m3u8 -f image2 -q:v 1 -vframes 1 f.png ; feh f.png

Got frame 250 (bad)

F=125;rm -f f.png;./ffmpeg -y -ss `awk "BEGIN {print (${F})/25}"` -i a/a.m3u8 -f image2 -q:v 1 -vframes 1 f.png
./ffplay f.png

Got frame 125 (good)

F=124;rm -f f.png;./ffmpeg -y -ss `awk "BEGIN {print (${F})/25}"` -i a/a.m3u8 -f image2 -q:v 1 -vframes 1 f.png
./ffplay f.png

Got frame 125 (bad)

Now try the same with the mp4 and you'll always get the exact right frame

F=130;rm -f f.png;./ffmpeg -y -ss `awk "BEGIN {print (${F})/25}"` -i a.mp4 -f image2 -q:v 1 -vframes 1 f.png
./ffplay f.png

Got 130 (good)

F=126;rm -f f.png;./ffmpeg -y -ss `awk "BEGIN {print (${F})/25}"` -i a.mp4 -f image2 -q:v 1 -vframes 1 f.png
./ffplay f.png

Got 126 (good)
etc

it seems to only be seeking on segment boundaries.

Change History (12)

comment:1 by Louis Letourneau, 6 years ago

Work from Nick Ryan solves the issue it seems:
https://patchwork.ffmpeg.org/patch/10767/

comment:2 by Balling, 5 years ago

Status: newopen

Again the patch is there.

comment:3 by Carl Eugen Hoyos, 5 years ago

Component: undeterminedavformat
Keywords: hls added
Version: unspecifiedgit-master

comment:6 by SuRGeoNix, 3 years ago

I think this is related with this https://trac.ffmpeg.org/ticket/9356

It's been a long time for this one and couple of patches are existing already.

comment:7 by Balling, 3 years ago

Resolution: fixed
Status: openclosed
Summary: HLS not accurately seekingHLS not accurately seeking on TS

e78d0810d1741535c95e5ae0f198977626b1cdff fixes it, indeed.

ffmpeg -ss 3 -i http://vectronic.io/hls_seek_issue/ts/in.m3u8 -t 2 out.mp4

produces not 262 bytes files and to ts does not produce 0 bytes file.
ffmpeg -ss 3 -i http://vectronic.io/hls_seek_issue/fmp4/in.m3u8 -t 2 out.mp4

still is bad, since fmp4 requires http://ffmpeg.org/pipermail/ffmpeg-devel/2020-April/261343.html but that is #7359.

THAT MUST BE fixed ASAP too.

comment:8 by R. Linden, 2 years ago

Any update onto this?

in reply to:  8 comment:9 by Balling, 2 years ago

Replying to R. Linden:

Any update onto this?

This one is fixed.

comment:10 by SuRGeoNix, 2 years ago

I tried the latest from master and I'm still having issues seeking in HLS/TS (loops). Still requires the https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=1018 patch to work properly. I will try to do more testing and give you an update.

Last edited 2 years ago by SuRGeoNix (previous) (diff)

comment:11 by Balling, 6 weeks ago

The fmp4 issue is also fixed, in 380a518c439d4e5e3cf17b97e4a06259e8048f99

comment:12 by ThomasC, 4 weeks ago

Also experiencing this still as of version 6.0 with HLS (TS) streams, but I assume this is the case with later versions too as vectronic's patch seems to resolve this issue but has not been applied upstream afaict?

Here is the my current usage which should seek the stream to zero (first keyframe) but instead seeks to the second keyframe:

av_seek_frame(format_ctx, stream_index, 0LL, AVSEEK_FLAG_BACKWARD);
Note: See TracTickets for help on using tickets.