2013-12-13 3 views
1

Я запускаю Wowza 3.6.2 на Windows 8.1 (64 бит) и включил надстройку Transcoder. Я использую транскодер для съемки JPEG-снимков из прямого потока. Я создал собственный HTTPProvider, похожий на то, что описано here. Это прекрасно работает, и я могу получить JPG-снимки из потока через мой HTTPProvider.Wowza Transcoder Add-on throws ArrayIndexOutOfBoundsException

Проблема заключается в том, что, поскольку я включил транскодер, я получаю раздражающие сообщения об ошибках на моем сервере, зарегистрировав 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) 

я получаю три из каждого исключения, когда я publish/unpublish (по одному для каждого блока Encode, который включен в файле transrate.xml).

Есть ли у кого-нибудь идея о том, что может быть причиной этого?

ответ

0

После того, как я отправил свой вопрос, я еще раз взглянул на стеклу и понял, в чем проблема: я все время искал не в том направлении. Поскольку проблема возникла, когда я включил транскодер, я пришел к выводу, что проблема должна быть. Я не понял, что onPublish и onUnPublish срабатывает несколько раз, когда вы используете транскодер - один раз для входящего потока и один раз для каждого транскодированного потока.

Внутри методов onPublish и onUnPublish моего модуля я делаю вещи, такие как read querystring-paramters, которых нет в транскодированных потоках. Вот почему исключения выбрасываются, когда вызываются методы onPublish и onUnPublish для транскодированных потоков.

Чтобы исправить это, я добавил две строки в начале onPublish и onUnPublish методов.

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

Несколько некрасиво решение, но я контролирую все имена потока и не допускаю подчеркивание в них так или иначе, так что в моем случае это работает отлично.

Update:

@flux предоставил гораздо приятнее решение о том, как проверить, если поток является результатом операции перекодирования. См. his answer для получения дополнительной информации.

1

Вот лучший способ определить, если поток является транскодирования поток, а не исходный поток

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

Это гораздо лучшее решение, на самом деле, не было известно о той собственности. Я дал вам +1 за это, но сейчас я сохраню свой ответ как принятый, так как он объясняет причину исключений. –

Смежные вопросы