[FFmpeg-trac] #6457(ffmpeg:new): Encrypted HLS - wrong ranges in .m3u8 file
FFmpeg
trac at avcodec.org
Tue Jun 13 12:06:06 EEST 2017
#6457: Encrypted HLS - wrong ranges in .m3u8 file
-------------------------------------+-------------------------------------
Reporter: d3im | Type: defect
Status: new | Priority: normal
Component: ffmpeg | Version:
Keywords: HLS ffmpeg | unspecified
Blocking: | Blocked By:
Analyzed by developer: 0 | Reproduced by developer: 0
-------------------------------------+-------------------------------------
Summary of the bug:
How to reproduce:
{{{
% ffmpeg -i input.mp4 -c:v libx264 -crf 28 -profile high -level 41
-keyint_min 25 -c:a libfdk_aac -vbr 1 -hls_time 6 -hls_list_size 0
'''-hls_flags single_file''' -hls_playlist_type vod -hls_key_info_file
file.keyinfo -f hls fftest/cle.m3u8
ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 5.4.0 (Gentoo 5.4.0-r3 p1.3, pie-0.6.5)
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64
--docdir=/usr/share/doc/ffmpeg-3.3.2/html --mandir=/usr/share/man
--enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++
--ar=x86_64-pc-linux-gnu-ar --optflags='-march=haswell -mavx2 -msse4.2
-msse4.1 -O2 -pipe -mmmx -msse -msse2 -mssse3 --param l1-cache-size=32
--param l1-cache-line-size=64 --param l2-cache-size=8192 -mtune=haswell'
--disable-static --enable-avfilter --enable-avresample --disable-stripping
--enable-version3 --disable-indev=oss --disable-outdev=oss --enable-
nonfree --enable-bzlib --disable-runtime-cpudetect --disable-debug
--disable-gcrypt --enable-gnutls --disable-gmp --enable-gpl --enable-
hardcoded-tables --enable-iconv --enable-lzma --enable-network --disable-
openssl --enable-postproc --enable-libsmbclient --enable-ffplay --enable-
sdl2 --enable-vaapi --disable-vdpau --enable-xlib --enable-libxcb
--enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --disable-libcdio
--disable-libiec61883 --disable-libdc1394 --disable-libcaca --disable-
openal --enable-opengl --disable-libv4l2 --enable-libpulse --disable-
libopencore-amrwb --disable-libopencore-amrnb --enable-libfdk-aac
--enable-libopenjpeg --enable-libbluray --disable-libcelt --disable-libgme
--disable-libgsm --disable-mmal --disable-libmodplug --enable-libopus
--disable-libilbc --disable-librtmp --disable-libssh --disable-
libschroedinger --enable-libspeex --enable-libvorbis --enable-libvpx
--disable-libzvbi --disable-libbs2b --disable-chromaprint --disable-
libflite --enable-frei0r --disable-libfribidi --disable-fontconfig
--enable-ladspa --disable-libass --enable-libfreetype --disable-
librubberband --disable-netcdf --disable-libzmq --disable-libzimg
--enable-libvidstab --disable-libsoxr --enable-pthreads --disable-libvo-
amrwbenc --enable-libmp3lame --disable-libkvazaar --disable-nvenc
--disable-libopenh264 --disable-libsnappy --enable-libtheora --disable-
libtwolame --disable-libwavpack --enable-libwebp --enable-libx264
--enable-libx265 --enable-libxvid --disable-amd3dnow --disable-amd3dnowext
--disable-fma4 --disable-xop --cpu=haswell --disable-doc --disable-
htmlpages --enable-manpages
libavutil 55. 58.100 / 55. 58.100
libavcodec 57. 89.100 / 57. 89.100
libavformat 57. 71.100 / 57. 71.100
libavdevice 57. 6.100 / 57. 6.100
libavfilter 6. 82.100 / 6. 82.100
libavresample 3. 5. 0 / 3. 5. 0
libswscale 4. 6.100 / 4. 6.100
libswresample 2. 7.100 / 2. 7.100
libpostproc 54. 5.100 / 54. 5.100
$ cat file.keyinfo
file.key
fftest/file.key
file.key is 16-byte file genereted by
openssl rand 16 > fftest/file.key
----
$ cat cle.m3u8
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="file.key"
#EXTINF:12.000000,
#EXT-X-BYTERANGE:8383484 at 0
cle.ts
#EXTINF:2.208333,
#EXT-X-BYTERANGE:597088 at 8383484
cle.ts
#EXTINF:10.416667,
#EXT-X-BYTERANGE:1874548 at 8980572
cle.ts
#EXTINF:3.166667,
#EXT-X-BYTERANGE:497448 at 10855120
cle.ts
#EXTINF:8.458333,
#EXT-X-BYTERANGE:4049332 at 11352568
cle.ts
#EXTINF:10.416667,
#EXT-X-BYTERANGE:1993364 at 15401900
cle.ts
#EXTINF:3.333333,
#EXT-X-BYTERANGE:641456 at 17395264
cle.ts
#EXT-X-ENDLIST
}}}
As workaround I used this:
{{{
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -profile high -level 41
-keyint_min 25 -c:a libfdk_aac -vbr 1 -hls_time 6 -hls_list_size 0
-hls_playlist_type vod -hls_key_info_file file.keyinfo -f hls
fftest/cle_s.m3u8
cat cle_s*.ts > clex.ts
and computed ranges manually. And it works now.
----
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="file.key"
#EXTINF:12.000000,
#EXT-X-BYTERANGE:8383488 at 0
clex.ts
#EXTINF:2.208333,
#EXT-X-BYTERANGE:597280 at 8383488
clex.ts
#EXTINF:10.416667,
#EXT-X-BYTERANGE:1874752 at 8980768
clex.ts
#EXTINF:3.166667,
#EXT-X-BYTERANGE:497648 at 10855520
clex.ts
#EXTINF:8.458333,
#EXT-X-BYTERANGE:4049536 at 11353168
clex.ts
#EXTINF:10.416667,
#EXT-X-BYTERANGE:1993568 at 15402704
clex.ts
#EXTINF:3.333333,
#EXT-X-BYTERANGE:641648 at 17396272
clex.ts
#EXT-X-ENDLIST
}}}
It seems The ranges are counted right before encrypting since non-
encrypted HLS encoding have same ranges.
Fix seems to be made easy - count size of encrypted chunk instead of non-
encrypted. But i really didn't search source, so I only guessing. Thanks.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/6457>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list