Расширение 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;
Другие вопросы по тегам