【问题标题】:Wowza Transcoder Add-on throws ArrayIndexOutOfBoundsExceptionWowza Transcoder Add-on 抛出 ArrayIndexOutOfBoundsException
【发布时间】:2014-01-01 10:51:24
【问题描述】:

我在 Windows 8.1(64 位)上运行 Wowza 3.6.2 并启用了 Transcoder 插件。我正在使用转码器从实时流中获取 JPEG 快照。我已经构建了一个自定义 HTTPProvider,类似于here 的描述。这工作正常,我可以通过我的 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 文件中启用的每个编码块一个)。

有人知道是什么原因造成的吗?

【问题讨论】:

    标签: wowza transcoding wowza-transcoder


    【解决方案1】:

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

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

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

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

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

    更新:

    @flux 为如何检查流是否是转码操作的结果提供了一个更好的解决方案。请参阅his answer 了解更多信息。

    【讨论】:

      【解决方案2】:

      这是判断流是转码流还是源流的更好方法

      if(stream.isTranscodeResult()) return;
      

      【讨论】:

      • 这确实是一个更好的解决方案,不知道该属性。为此我给了你一个 +1,但我暂时将我的答案保留为已接受的答案,因为它解释了例外的原因。
      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 2023-03-16
      • 1970-01-01
      • 2012-04-12
      • 2013-05-10
      • 1970-01-01
      • 2020-02-07
      • 2012-03-26
      相关资源
      最近更新 更多