1

我在 Windows 8.1(64 位)上运行 Wowza 3.6.2 并启用了 Transcoder 插件。我正在使用转码器从实时流中获取 JPEG 快照。我已经构建了一个自定义 HTTPProvider,类似于此处描述的内容。这工作正常,我可以通过我的 HTTPProvider 从流中获取 JPG 快照。

问题是,由于我启用了转码器,我在服务器登录onPublishonUnPublish任何流中都会收到令人讨厌的错误消息。

作为转码器模板,我使用了 Wowza 安装附带的默认 transrate.xml,没有对其进行任何修改。

当我发布到流时,asdf我收到类似以下的错误:

ERROR server comment - TranscoderSessionDestination.init[livereceiver/_definst_/asdf]: [asdf_160p]:java.lang.ArrayIndexOutOfBoundsException: 1
java.lang.ArrayIndexOutOfBoundsException: 1
    at com.foo.wms.module.IncomingStreamEventHandler.getQueryStringMap(IncomingStreamEventHandler.java:191)
    at com.foo.wms.module.IncomingStreamEventHandler.onPublish(IncomingStreamEventHandler.java:83)
    at com.wowza.wms.stream.MediaStream.notifyActionPublish(Unknown Source)
    at com.wowza.wms.stream.publish.Publisher.publish(Unknown Source)
    at com.wowza.wms.stream.publish.Publisher.publish(Unknown Source)
    at com.wowza.wms.transcoder.model.TranscoderSessionDestination.init(Unknown Source)
    at com.wowza.wms.transcoder.model.TranscoderSession.a(Unknown Source)
    at com.wowza.wms.transcoder.model.TranscoderSession.handleOnMetadata(Unknown Source)
    at com.wowza.wms.transcoder.model.LiveStreamTranscoder.handleOnMetadata(Unknown Source)
    at com.wowza.wms.stream.live.LiveStreamTranscoderRunner.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

当我取消发布流时,我得到了这个:

ERROR server comment - TranscoderSessionDestination.shutdown: [asdf_160p]:java.lang.NullPointerException
java.lang.NullPointerException
    at com.foo.wms.module.IncomingStreamEventHandler.onUnPublish(IncomingStreamEventHandler.java:166)
    at com.wowza.wms.stream.MediaStream.notifyActionUnPublish(Unknown Source)
    at com.wowza.wms.stream.publish.Publisher.publish(Unknown Source)
    at com.wowza.wms.stream.publish.Publisher.unpublish(Unknown Source)
    at com.wowza.wms.transcoder.model.TranscoderSessionDestination.shutdown(Unknown Source)
    at com.wowza.wms.transcoder.model.TranscoderSession.c(Unknown Source)
    at com.wowza.wms.transcoder.model.TranscoderSession.shutdown(Unknown Source)
    at com.wowza.wms.transcoder.model.LiveStreamTranscoder.shutdown(Unknown Source)
    at com.wowza.wms.stream.live.LiveStreamTranscoderRunner.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

当我发布/取消发布时,我得到三个异常(transrate.xml 文件中启用的每个编码块一个)。

有没有人知道可能导致这种情况的原因?

4

2 回答 2

1

这是确定流是转码流而不是源流的更好方法

if(stream.isTranscodeResult()) return;
于 2014-01-13T19:23:05.037 回答
0

在发布我的问题后,我再次查看了堆栈跟踪并意识到问题所在 - 我一直在寻找错误的方向。由于在启用转码器时出现了问题,因此我得出结论,这就是问题所在。我没有意识到的是,onPublishonUnPublish您使用转码器时会触发多次 - 一次用于传入流,一次用于每个转码流。

在我的模块的onPublishandonUnPublish方法中,我做了一些事情,比如读取查询字符串参数,这些在转码流中不存在。这就是为转码流调用onPublishonUnPublish方法时引发异常的原因。

onPublish为了解决这个问题,我在和onUnPublish方法的开头添加了两行。

if (streamName.contains("_"))
    return;

一个有点丑陋的解决方案,但我控制着所有流名称,并且无论如何都不允许在它们中使用下划线,所以在我的情况下这很好用。

更新:

@flux 为如何检查流是否是转码操作的结果提供了更好的解决方案。有关更多信息,请参阅他的答案

于 2013-12-13T16:12:13.043 回答