Wowza中的冗余HLS流

问题描述 投票:0回答:2

当使用Java API生成动态播放列表(AMLST)时,是否可以将备用(备份)流添加到Wowza中的HLS清单。

我有一个这样的代码,我动态添加不同的比特率,但我想添加一个备份流。 (我尝试添加第二个MediaListSegment但它似乎不起作用)。

package com.wowza.wms.plugin.test.module;

import com.wowza.wms.medialist.*;
import com.wowza.wms.module.*;
import com.wowza.wms.stream.*;
import com.wowza.wms.application.*;

public class ModuleAMLSTTestLive extends ModuleBase 
{
class MyMediaListProvider implements IMediaListProvider
{
    public MediaList resolveMediaList(IMediaListReader mediaListReader, IMediaStream stream, String streamName)
    {
        MediaList mediaList = new MediaList();

        MediaListSegment segment = new MediaListSegment();
        mediaList.addSegment(segment);

        MediaListRendition rendition1 = new MediaListRendition();
        segment.addRendition(rendition1);

        rendition1.setName(streamName+"_400");
        rendition1.setBitrateAudio(128000);
        rendition1.setBitrateVideo(400000);
        rendition1.setWidth(320);
        rendition1.setHeight(240);
        rendition1.setAudioCodecId("mp4a.40.2");
        rendition1.setVideoCodecId("avc1.66.12");

        MediaListRendition rendition2 = new MediaListRendition();
        segment.addRendition(rendition2);

        rendition2.setName(streamName+"_800");
        rendition2.setBitrateAudio(128000);
        rendition2.setBitrateVideo(800000);
        rendition2.setWidth(640);
        rendition2.setHeight(480);
        rendition2.setAudioCodecId("mp4a.40.2");
        rendition2.setVideoCodecId("avc1.77.31");

        return mediaList;
    }
}

public void onAppStart(IApplicationInstance appInstance)
{
    appInstance.setMediaListProvider(new MyMediaListProvider());
}

}

java http-live-streaming wowza
2个回答
0
投票

虽然API不支持,但我终于找到了一个解决方案:

可以通过在URL或DOMAIN cupertino标记中使用流的绝对路径指定流来定义主流和备份流。

样品微笑:

<body>
  <switch>
      <video src="mp4:foo.mp4" system-bitrate="300000">
    <param name="videoCodecId" value="avc1.66.30" valuetype="data"/>
    <param name="audioCodecId" value="mp4a.40.2" valuetype="data"/>
    <param name="cupertinoTag.URI" value="http://serverwowza1.foo.com:1935/vod/mp4:foo.mp4/chunklist.m3u8" valuetype="data"/>
      </video>
      <video src="mp4:foo.mp4" system-bitrate="300000" >
    <param name="videoCodecId" value="avc1.66.30" valuetype="data"/>
    <param name="audioCodecId" value="mp4a.40.2" valuetype="data"/>
    <param name="cupertinoTag.URI" value="http://serverwowza2.foo.com:1935/vod/mp4:sample.mp4/chunklist.m3u8" valuetype="data"/>
      </video>
...

0
投票

您的解决方案有一个重大问题,您的块列表URI不包含Wowza会话ID(通常在块列表文件名中的“_w #####”位),它真的不能,因为您不可能知道那是什么是在您创建smil文件时。如果没有会话ID,那么每个玩家对该块列表的每个请求都将创建一个新的“Wowza HTTP会话”,这可能会导致一些问题,例如Java堆消耗和无法跟踪连接的实际客户端数量。

更好(尽管没有文档记录)的解决方案是用一个条目替换你的两个条目,该条目用你的两个域指定“cupertinoTag.DOMAIN”参数:

  <video src="mp4:foo.mp4" system-bitrate="300000">
<param name="videoCodecId" value="avc1.66.30" valuetype="data"/>
<param name="audioCodecId" value="mp4a.40.2" valuetype="data"/>
<param name="cupertinoTag.DOMAIN" value="serverwowza1.foo.com:1935,serverwowza2.foo.com:1935" valuetype="data"/>
  </video>

然后,它应该在生成的主播放列表中创建两个完全形成的绝对块列表条目(EXT-X-STREAM-INF标记,后跟其关联的URI),每个域一个,包括会话ID。

请注意,在对备份服务器上的块列表(来自同一播放器)的初始请求时,将创建具有指定标识的会话。


对于amlst API,您实际上可以通过rendition属性成员执行相同的操作。

        rendition.getProperties().setProperty("cupertinoTag.DOMAIN", "serverwowza1.foo.com:1935,serverwowza2.foo.com:1935");
© www.soinside.com 2019 - 2024. All rights reserved.