【发布时间】:2016-05-20 13:24:30
【问题描述】:
我有一个客户端,其中包含数千个在内部流式传输的音频/视频文件,所有文件都被分段 (.ts) 并保存在 S3 存储桶中,并在 SQL 数据库中包含适当的元数据。现在他们要求我创建两个“实时”流,一个用于音频,一个用于视频,他们可以设置并忘记。
不想重新分割所有内容或将我试图破解的所有文件连接到一个“实时”m3u8 中,该 m3u8 可以在现有文件中滑动(它们都以完全相同的方式编码)。
我所做的是生成一个“广播播放列表”,它以 40 秒的间隔(每 m3u8 x3 .ts)保存到数据库中,每个都标有开始和结束时间以及适当的 EXT-X-MEDIA-顺序。然后我在 NOW() 之间进行选择并推送文件。
它可以工作,但有时时机是正确的,它会为第一个和最后一个文件命中相同的分组并缓冲。我可以完全控制播放器 (VideoJS) 和服务器以使其正常工作。
这是我到目前为止的代码......我可以通过什么方式完成这项工作?我还没有尝试在 vJS 上玩缓冲区(不知道如何......)
所有基本文件信息都这样存储在数据库中
INSERT INTO `contenido_audio_hls` (`id`, `audio_s`, `duration`) VALUES ('f2z7dcwc0l7rleig', '["10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","10.000000","4.100000"]', 10);
生成播放列表时,我提取所需的数据
$radio = sql("SELECT lista_contenido.orden,lista_contenido.contenido,contenido_audio_hls.audio_s FROM lista_listas LEFT JOIN lista_contenido ON (lista_listas.id = lista_contenido.lista) LEFT JOIN contenido_audio_hls ON (lista_contenido.contenido = contenido_audio_hls.id) WHERE (lista_listas.tipo = 'radio') ORDER BY lista_contenido.orden ASC");
foreach($radio['data'] as $k=>$v) {
$arreglo = json_decode($v['audio_s'],TRUE);
foreach($arreglo as $kk=>$vv) {
$puro[] = array("extinf"=>'#EXTINF:'.$vv.',',"id"=>$v['contenido'],"segment"=>$kk);
}
}
我遍历它们以创建组
$segundos = 0;
$grupo = 1;
$contador = 1;
foreach($puro as $k=>$v) {
if($segundos <= 30) {
$m3u8[$grupo][] = $puro[$k];
$contador++;
} else {
$m3u8[$grupo][] = $puro[$k];
$grupo = $grupo + $contador;
$segundos = 0;
}
$segundos = $segundos + 10;
}
然后把它们放到自己的桌子上
$largo = 0;
foreach($m3u8 as $k=>$v) {
$ini = sprintf('%02d:%02d:%02d',($largo/3600),($largo/60%60),$largo%60);
$localfin = $largo + 40;
$fin = sprintf('%02d:%02d:%02d',($localfin/3600),($localfin/60%60),$localfin%60);
$query = "INSERT INTO lista_m3u8 (ini,fin,tipo,sequence,data) VALUES('".$ini."','".$fin."','radio','".$k."','".json_encode($v)."')";
sql($query);
$largo = $largo + 40;
}
这给了我这个
INSERT INTO `lista_m3u8` (`ini`, `fin`, `tipo`, `sequence`, `data`) VALUES ('06:54:00', '06:54:40', 'radio', 580636, '[{"extinf":"#EXTINF:10.000000,","id":"f2z7de0quwgehw23","segment":14},{"extinf":"#EXTINF:10.000000,","id":"f2z7de0quwgehw23","segment":15},{"extinf":"#EXTINF:10.000000,","id":"f2z7de0quwgehw23","segment":16},{"extinf":"#EXTINF:10.000000,","id":"f2z7de0quwgehw23","segment":17}]');
INSERT INTO `lista_m3u8` (`ini`, `fin`, `tipo`, `sequence`, `data`) VALUES ('06:54:40', '06:55:20', 'radio', 582504, '[{"extinf":"#EXTINF:10.000000,","id":"f2z7de0quwgehw23","segment":18},{"extinf":"#EXTINF:10.000000,","id":"f2z7de0quwgehw23","segment":19},{"extinf":"#EXTINF:0.766667,","id":"f2z7de0quwgehw23","segment":20},{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":0}]');
INSERT INTO `lista_m3u8` (`ini`, `fin`, `tipo`, `sequence`, `data`) VALUES ('06:55:20', '06:56:00', 'radio', 584375, '[{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":1},{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":2},{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":3},{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":4}]');
INSERT INTO `lista_m3u8` (`ini`, `fin`, `tipo`, `sequence`, `data`) VALUES ('06:56:00', '06:56:40', 'radio', 586249, '[{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":5},{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":6},{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":7},{"extinf":"#EXTINF:10.000000,","id":"f2z7dft8c217xyp","segment":8}]');
然后生成m3u8
$audio = sql("SELECT sequence, data FROM lista_m3u8 WHERE tipo = 'radio' AND ini <= DATE_FORMAT(NOW(),'%H:%i:%s') AND fin >= DATE_FORMAT(NOW(),'%H:%i:%s')");
$sale = '#EXTM3U'.PHP_EOL;
$sale .= '#EXT-X-VERSION:3'.PHP_EOL;
$sale .= '#EXT-X-MEDIA-SEQUENCE:'.$audio['data'][0]['sequence'].PHP_EOL;
$sale .= '#EXT-X-TARGETDURATION:10'.PHP_EOL;
$arreglo = json_decode($audio['data'][0]['data'],TRUE);
foreach($arreglo as $k=>$v) {
$sale .= $v['extinf'].PHP_EOL;
$sale .= S3URL("bucket-audio",$v['id']."/segment".sprintf('%05d',$v['segment']).".ts",(count($arreglo) * 25)).PHP_EOL;
}
header("Content-type: application/x-mpegURL");
echo $sale.PHP_EOL;
【问题讨论】:
标签: php amazon-s3 video.js http-live-streaming m3u8