我现在在使用ffmpeg的时候使用了master_pl_name来生成主播放列表,然后使用了hls_base_url来设置每一个分片的前缀,但是命令hls_base_url对主播放列表不生效,请问一下如何设置才能使主播放列表中每一个子m3u8可以有前缀
我使用的命令如下:
D:\work\vod\vod-service\src\main\resources\bin\Windows-amd64\ffmpeg.exe -i "D:\temp\test_file.mp4"
-map 0 -c:v:0 libx264 -c:a:0 aac -filter:v:0 scale=-1:1080
-map 0 -c:v:1 libx264 -c:a:1 aac -filter:v:1 scale=-1:720
-map 0 -c:v:2 libx264 -c:a:2 aac -var_stream_map "v:0,a:0,name:1080P v:1,a:1,name:720P v:2,a:2,name:original"
-start_number 10 -hls_time 10 -hls_list_size 0 -hls_start_number_source 1 -hls_base_url "http://localhost/m3u8/test/" -master_pl_name "index.m3u8"
-hls_segment_filename "D:\nginx-1.24.0\html\m3u8\index_%v-%09d.ts" "D:\nginx-1.24.0\html\m3u8\index_%v.m3u8"
我进行了尝试后,目前采用的方法是通过代码为主m3u8文件中的不同子m3u8手写前缀,询问一下是否有更好的方式方法
要实现这个效果,可以使用ffmpeg的-hls_segment_filename选项,它可以为ts分片文件和m3u8索引文件指定不同的输出路径和文件名格式。可以修改为:
-hls_segment_filename "D:\nginx-1.24.0\html\m3u8\%v\index_%09d.ts" "D:\nginx-1.24.0\html\m3u8\%v\index.m3u8"
这里%v会被自动替换为不同的variant名称,如1080p。然后不同variant的ts分片和m3u8索引文件会按照指定路径输出到不同目录,实现了基础URL的效果。
ffmpeg.exe -i "D:\temp\test_file.mp4"
-map 0 -c:v:0 libx264 -c:a:0 aac -filter:v:0 scale=-1:1080 -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename "D:\nginx-1.24.0\html\m3u8\1080P/index_%09d.ts" -hls_base_url "http://localhost/m3u8/1080P/" "D:\nginx-1.24.0\html\m3u8/1080P/index.m3u8"
-map 0 -c:v:1 libx264 -c:a:1 aac -filter:v:1 scale=-1:720 -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename "D:\nginx-1.24.0\html\m3u8/720P/index_%09d.ts" -hls_base_url "http://localhost/m3u8/720P/" "D:\nginx-1.24.0\html\m3u8/720P/index.m3u8"
-map 0 -c:v:2 libx264 -c:a:2 aac -f hls -hls_time 10 -hls_list_size 0 -hls_segment_filename "D:\nginx-1.24.0\html\m3u8/original/index_%09d.ts" -hls_base_url "http://localhost/m3u8/original/" "D:\nginx-1.24.0\html\m3u8/original/index.m3u8"
可以试试这个