Расширение Wowza Transcoder создает исключение ArrayIndexOutOfBoundsException
Я использую Wowza 3.6.2 в Windows 8.1 (64 бит) и включил надстройку Transcoder. Я использую транскодер, чтобы делать JPEG-снимки из прямой трансляции. Я создал собственный HTTPProvider, похожий на тот, что описан здесь. Это работает нормально, и я могу получить JPG-снимки из потока через мой HTTPProvider.
Проблема в том, что, поскольку я включил транскодер, в моем сервере появляются раздражающие сообщения об ошибках onPublish
а также onUnPublish
любого потока.
В качестве шаблона транскодера я использовал файл transrate.xml по умолчанию, который поставляется с установкой Wowza, без каких-либо изменений.
Когда я публикую в потоке 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).
Кто-нибудь имеет представление о том, что может быть причиной этого?
2 ответа
После публикации моего вопроса я еще раз взглянул на трассировку стека и понял, в чем проблема - я все время искал в неправильном направлении. Поскольку проблема появилась, когда я включил транскодер, я пришел к выводу, что проблема должна быть именно там. То, что я не понял, было то, что onPublish
а также onUnPublish
срабатывает несколько раз при использовании транскодера - один раз для входящего потока и один раз для каждого транскодированного потока.
В пределах onPublish
а также onUnPublish
Методы моего модуля я делаю, например, readstring-paramters, которых нет в транскодированных потоках. Вот почему исключения выбрасываются, когда onPublish
а также onUnPublish
Методы вызываются для транскодированных потоков.
Чтобы исправить это, я добавил две строки в начале onPublish
а также onUnPublish
методы.
if (streamName.contains("_"))
return;
Несколько уродливое решение, но я контролирую все имена потоков и не допускаю подчеркивания в них, так что в моем случае это работает нормально.
Обновить:
@flux предоставил гораздо лучшее решение для проверки того, является ли поток результатом операции транскодирования. Смотрите его ответ для получения дополнительной информации.
Вот лучший способ определить, является ли поток транскодированным потоком, а не исходным потоком.
if(stream.isTranscodeResult()) return;