创建指向其他m3u8文件的m3u8文件

时间:2015-05-11 17:43:48

标签: ffmpeg m3u8 hls adaptive-bitrate

我正在寻找基于带宽创建一个指向其他m3u8文件的m3u8文件,类似这样

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:4
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=500000,RESOLUTION=480x270
480x270.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000000,RESOLUTION=640x360
640x360.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2000000,RESOLUTION=1280x720
1280x720.m3u8
#EXT-X-ENDLIST

我希望能够使用ffmpeg做到这一点,但我似乎找不到任何关于这样做的信息。这可能是错误的方式,所以如果有人能指出我正确的方向,将非常感激。

1 个答案:

答案 0 :(得分:3)

2018年1月更新

您现在可以使用var_stream_map-g <size> -sc_threshold 0直接使用FFmpeg创建主播放列表。请参阅documentation

您无法直接使用FFmpeg(尚未)创建HLS主播放列表。您可以为多个比特率编码相同的来源并获取每个变体播放列表,但您必须自己提供主数据。

当然,生成的流必须对齐,所以你要么:

  • 使用固定的GOP尺寸(--keyint <size> --min-keyint <size> --scenecut -1,x264 @if (@CodeSection == @Batch) @then @ECHO off setlocal enabledelayedexpansion rem // invoke JScript chimera to get the YYYYMMDD of the previous work day for /f %%I in ('cscript /nologo /e:JScript "%~f0"') do set "prevbusday=%%I" echo %prevbusday% pause type NUL > test.msl For /L %%G IN (3,1,9) DO ( For /L %%H IN (0,1,59) DO ( set "h=0%%H" type NUL > test.msl ECHO %prevbusday%0%%G!h:~-2! set "id=%prevbusday%0%%G!h:~-2!" (echo OPENVIEW SERVERID 'Mobius Server ' REPORTID 'TestReports ' VERSIONID ' !id! 'SECTIONID ' 0000-000 Name of Report' PAGE 1)>> test.msl (echo EXPORT ASCII FILE 'C:\New folder\check.rpt' CURSEC GROUP '')>> test.msl (echo CLOSE) >> test.msl PING 1.1.1.1 -w 1000 -n 1 Start test.msl PING 1.1.1.1 -w 1000 -n 1 start passwordinjector.vbs PING 1.1.1.1 -w 500 -n 1 IF EXIST "C:\New folder\check.rpt" ( echo It exists! taskkill /IM MAINRDW.exe /f >nul 2>&1 PING 1.1.1.1 -w 1000 -n 1 Start Trial.msl PING 1.1.1.1 -w 1000 -n 1 start passwordinjector.vbs PING 1.1.1.1 -w 3000 -n 1 Del "C:\Desktop\New folder\check.rpt" exit ) ELSE ( echo It doesn't exist :( PING 1.1.1.1 -w 500 -n 1 taskkill /IM MAINRDW.exe /f >nul 2>&1 ) ) ) pause goto :EOF @end // end batch / begin JScript chimera var day = 1000 * 60 * 60 * 24, yesterday = new Date().getDay() - 1, prevbusday = new Date(!yesterday?new Date()-day*3:(yesterday<0?new Date()- day*2:new Date()-day)), y = [ prevbusday.getFullYear(), ('0' + (prevbusday.getMonth() + 1)).match(/\d\d$/)[0], ('0' + prevbusday.getDate()).match(/\d\d$/)[0] ] WSH.Echo(y.join(''));

  • 如果适用,请每隔一次传递2-pass encoding using the same first pass statfile。如果您在所需比特率的中间使用生成stat文件进行再现,则效果会更好,因为会有一些精度损失。