2013-12-13 46 views
1

我在Windows 8.1(64位)上運行Wowza 3.6.2並啓用了轉碼器插件。我正在使用代碼轉換器從實時流中獲取JPEG快照。我已經構建了一個自定義HTTPProvider,類似於here所描述的內容。這工作正常,我可以通過HTTPProvider從流中獲取JPG快照。Wowza轉碼器附加投擲ArrayIndexOutOfBoundsException

問題是,因爲我啓用了代碼轉換器,所以在我的服務器日誌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文件中啓用的每個Encode)。

有沒有人有什麼可能會導致此問題的想法?

回答

0

在發佈我的問題後,我又看了一眼堆棧跟蹤,意識到問題所在 - 我一直在錯誤的方向看。由於問題出現在我啓用代碼轉換器時,我認爲這是問題所在。我沒有意識到的是,當您使用代碼轉換器時,onPublishonUnPublish會多次觸發 - 一次爲傳入流,一次爲每個代碼轉換流。

onPublishonUnPublish我的模塊的方法我做東西,如讀取查詢字符串參數,這是不存在於轉碼流。這就是爲代碼轉換流調用onPublishonUnPublish方法時拋出異常的原因。

爲了解決這個問題,我在onPublishonUnPublish方法的開頭添加了兩行。

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

一個有點醜陋的解決方案,但我在所有的流名字的控制,並且不允許在下劃線他們無論如何,所以在我的情況下能正常工作。

更新:

@flux提供瞭如何檢查如果流是轉碼操作的結果好得多的解決方案。有關更多信息,請參閱his answer

1

這裏是一個更好的辦法來確定流是一個編碼數據流,而不是一個源流

if(stream.isTranscodeResult()) return; 
+0

這是一個更好的解決方案確實不知道該財產。我給了你一個+1,但我現在將答案保留爲接受的答案,因爲它解釋了例外的原因。 –