Как воспроизвести поток H264 с SilverLight?

У меня есть поток H264 (IIS - плавная потоковая передача), который я хотел бы воспроизвести с помощью SilverLight. Судя по всему SilverLight может, но как?

Примечание: SilverLight может воспроизводить поток VC-1, а H264 - нет.

Кроме того, я могу предоставить поток и любую дополнительную информацию. Кодировщик H264 используется в Media Foundation (MFT). То же самое и с VC-1, который работает (хотя невозможно создать равные фрагменты для плавной потоковой передачи, потому что принудительная вставка ключевых кадров делает видео рывками.

EDIT: значения MPEG2VIDEOINFO для H264:

Значения MPEG2VIDEOINFO для H264


person user1764961    schedule 04.08.2013    source источник
comment
Я определенно могу помочь с этим. Но это большая тема. Проблема может быть в исходном носителе, сервере или клиенте. Какой сервер вы используете? IIS? Вауза? Какие медиа вы транслируете? ismv? как выглядят ismc и ism? Откуда взялись СМИ? Вы это кодировали? принудительная вставка ключевого кадра не приведет к рывкам видео, если все сделано правильно.   -  person szatmary    schedule 07.08.2013
comment
Я использую IIS. У меня есть собственная реализация кодирования потока с использованием MFT VC-1 и H264. Как мне грустно, VC-1 работает нормально, но когда я вызываю IWMVideoForceKeyFrame :: SetKeyFrame () непосредственно перед IMFTransform :: ProcessInput (), ключевой кадр вставляется, как и ожидалось, но видео дергается. Под рывком я подразумеваю, что вы можете видеть, как был вставлен какой-то предыдущий кадр. Я могу запустить стрим и показать вам это. Что касается H264, я сделал все, как описано здесь: msdn .microsoft.com / en-us / library / ff402310 (v = vs.90) .aspx. Процесс кодирования запущен, IIS его получает, но клиенты не могут его декодировать.   -  person user1764961    schedule 08.08.2013
comment
@szatmary, если вам нужны данные или вы хотите посмотреть это «отрывистое» видео, просто дайте мне знать, и я его устрою.   -  person user1764961    schedule 08.08.2013
comment
Я хочу убедиться, что понимаю. Вы не можете заставить AVC работать полностью. VC-1 работает, но работает "рывками", если вы устанавливаете интервалы между ключевыми кадрами. Это правильно?   -  person szatmary    schedule 08.08.2013
comment
VC-1 работает, но если я принудительно вставляю ключевые кадры, чтобы создать фрагменты длиной 50 кадров перед их отправкой в ​​IIS, тогда кодек вставляет некоторые предыдущие кадры, и в результате получается прерывистое видео. Вы хотите это увидеть? Кодировка AVC1 работает - ошибок нет. Создание чанков и отправка в IIS тоже нормально. Но когда вы открываете этот поток в браузере, появляется только черный экран ... ничего. Кроме того, я тоже могу это продемонстрировать.   -  person user1764961    schedule 08.08.2013
comment
Вот резкий поток VC-1: access9.streamsink.com/smooth/SmoothStreamingPlayer.html Ключевой кадр вставляется в каждый 50-й кадр. Если вы проиграете поток медленнее, вы заметите, как вставлен предыдущий кадр. Если я не вставляю ключевые кадры вручную на каждый 50-й кадр, все в порядке. Игнорируйте чересстрочный контент.   -  person user1764961    schedule 08.08.2013


Ответы (2)


Просто предположение. Основываясь на вашем вопросе 18009152. Я предполагаю, что вы кодируете h.264, используя формат битового потока Annexb. Согласно комментариям, вы не можете указать кодировщику использовать формат AVCC. Следовательно, вы должны выполнить это преобразование вручную (Приложение B НЕ БУДЕТ работать в контейнере ISO). Вы можете сделать это, ища стартовые коды в своем потоке AVC. Начальный код составляет 3 или 4 байта (0x000001, 0x00000001). Вы можете узнать длину NALU, указав следующий начальный код или конец потока. Удалите начальный код (выбросьте его) и вместо него напишите размер NALU в 32-битном целочисленном big endian. Затем запишите эти данные в контейнер. Для ясности: это выполняется с видеокадрами, которые выходят из кодировщика. Дополнительные данные - это отдельный шаг, который, кажется, вы в основном выяснили (за исключением NALUSizeLength). Поскольку мы используем 4-байтовое целое число для записи размеров NALU, вы ДОЛЖНЫ установить для NALUSizeLength значение 4.

person szatmary    schedule 12.08.2013
comment
Хотя я не пробовал, думаю, вы это поймете. В моем случае стартовый код имеет длину 4 байта. Но, поскольку я не пишу это ни в один контейнер (я транслирую (PUSH) его в IIS), означает ли это, что я должен отправлять SPS / PPS с размером NALU перед отправкой каждого пакета с кадрами (например, 50 кадров) в IIS? Или с каждым кадром отправлять? Или... - person user1764961; 13.08.2013
comment
Будьте осторожны. Тот факт, что вы видите один 4-байтовый стартовый код, не означает, что их всех будет 4. Я не уверен, что вы подразумеваете под фреймами в данном случае. Но вам придется делать это для каждого NALU (стартового кода). Помните НАЛУ! = Кадр. Кадр может содержать несколько NALU. - person szatmary; 13.08.2013
comment
Да, я заметил около 10-12 NALU на кадр. Я добавил размер перед каждым NALU точно так, как вы сказали, но, к сожалению, это не помогло. :-( - person user1764961; 13.08.2013
comment
Оно работает!!!!!! Я забыл указать размер NALU с прямым порядком байтов. Ты заработал все до одной из 500. Я бы также купил тебе упаковку из 6 ... спас мою задницу. - person user1764961; 13.08.2013
comment
Отлично, рад, что смог помочь. Извините, что я вспыльчивый в комментариях. Я очень хорошо это знаю и расстраиваюсь, когда не могу передать свои мысли. как маленький ребенок :) - person szatmary; 13.08.2013
comment
То же самое. Я вышел из себя, потому что месяц отлаживал рабочий код. Обычно до 7 утра. Но мне нужен был парень, который действительно разбирается в вещах. Итак, вы предоставили недостающую часть - размер NALU для каждого NALU в каждом сжатом кадре. Завтра точно напьюсь :-) Еще раз спасибо !!! - person user1764961; 13.08.2013

Silverlight 3 может воспроизводить файлы H264. Используйте для этого MediaStreamSource.

Вот описание интерфейса: http://msdn.microsoft.com/en-us/library/system.windows.media.mediastreamsource(v=vs.95).aspx

Кроме того, эта запись в блоге связана с игрой H264 в Silverlight 3: http://nonsenseinbasic.blogspot.ru/2011/05/silverlights-mediastreamsource-some.html Это поможет вам с другими проблемами, которые могут возникнуть.

person Sergey K.    schedule 07.08.2013
comment
Что касается блоков NAL и 3-байтовых стартовых кодов, я не вижу способа добиться этого. Согласно MSDN, я должен отправлять SPS и PPS, объединенные вместе и разделенные полем длиной 2 байта. SSFMuxAddStream () понимает это, и когда я вызываю SSFMuxGetHeader (), эта функция создает SPS и PPS с 4-байтовыми стартовыми кодами. Поля длиной 2 байта просто заменяются 4-байтовыми кодами начала. - person user1764961; 08.08.2013
comment
Вы проверили этот пример? stackoverflow.com/questions/1966215/ - person Sergey K.; 08.08.2013
comment
Да, у меня есть. Я скачал из сети несколько примеров, а позже написал сам с нуля. Получил тот же результат. - person user1764961; 08.08.2013
comment
Как предположил szatmary, возможно, в потоке есть проблема ... но он разбивается на куски и отправляется в IIS таким же образом, как и VC-1. - person user1764961; 08.08.2013
comment
Их много, какую часть вы бы хотели увидеть? - person user1764961; 08.08.2013
comment
Длина 2 байта? Вы имеете в виду коробку avcC? Это больше, чем просто SPS + PPS - person szatmary; 08.08.2013
comment
@ user1764961: где вы получаете доступ к файлу и создаете MediaStreamSource - person Sergey K.; 08.08.2013
comment
Я имею в виду это: msdn.microsoft. com / en-us / library / ff402310 (v = vs.90) .aspx. Посмотрите раздел H.264 / AVC1. - person user1764961; 08.08.2013
comment
Предполагается, что частные данные кодека в случае H.264 / AVC1 являются частью структуры MPEG2VIDEOINFO сразу после VIDEOINFOHEADER2. - Вы уважаете это руководство? - person Sergey K.; 08.08.2013
comment
Мне очень жаль, user1764961, я больше ничем не могу помочь, пока вы не опубликуете код. Это может быть ПУТЬ ко многим вещам. - person szatmary; 08.08.2013
comment
Я помещаю частные данные кодека (SPS / PPS) по адресу dwSequenceHeader в MPEG2VIDEOINFO. - person user1764961; 08.08.2013
comment
Я не могу опубликовать 5000 строк кода. Вы должны сказать, что именно вас интересует. - person user1764961; 08.08.2013
comment
Что вы вкладываете в остальные ценности этой структуры? - person szatmary; 08.08.2013
comment
Нам нужна ваша помощь, чтобы ответить на ваш вопрос. Если вы не поможете нам, мы не сможем вам помочь. Как мы должны читать это изображение? Мое последнее предположение - убедиться, что ваш кодировщик НЕ кодирует в приложении B, и проверить размер length. Вероятно, 4, а не 2. Удачи. - person szatmary; 08.08.2013
comment
И вы уверены, что кодировщик не настроен на приложение B? Можете ли вы опубликовать фрагмент кода, подтверждающий это? Можете ли вы опубликовать документацию или код, в котором говорится, что NALUSizeLength = 2? - person szatmary; 08.08.2013
comment
@szatmary, я думаю, длина размера NALU здесь не имеет значения. Я почти уверен в этом, потому что согласно MSDN: MPEG2VIDEOINFO :: dwFlags - это количество байтов, используемых для поля длины, которое появляется перед каждым NALU. Поле длины указывает размер следующего NALU в байтах. Он должен быть установлен на CodecPrivateData NALUSizeLength + 1. Допустимые значения: 1, 2 и 4. Независимо от того, какой размер я использую, SSFMuxAddStream () API добавит поток, а SSFMuxGetHeader () вернет правильный SPS + PPS с 4 -байтный стартовый код. Исходя из этого, я бы сказал, что длина размера NALU всегда интерпретируется правильно. - person user1764961; 08.08.2013
comment
Да, вам чего-то не хватает. Я сказал это 3 раза. Опубликуйте часть кода, в которой вы настраиваете кодировщик h.264 для использования формата потока Avcc, а не кода приложения B. или GTFO. - person szatmary; 08.08.2013
comment
Он есть на прикрепленной картинке! Все параметры H264. На правой панели (вид памяти) находятся значения SPS / PPS. Вокруг него красный прямоугольник. Что еще я могу сделать, читать вам цифры ?! Иисус... - person user1764961; 09.08.2013
comment
Его нет на прилагаемой картинке. Вы думаете, что NALUSizeLength используется для установки значений в поле дополнительных данных. Это неправда. Он используется, когда декодер считывает размеры NALU при обработке элементарного потока. Это значение должно соответствовать значениям, создаваемым вашим кодировщиком. Вы недостаточно знаете об элементарном потоке. Я снова буду задницей. Покажите мне в коде, где вы устанавливаете формат битстрерама на avcc (а не на приложениеb), и покажите мне, где в кодировщике (НЕ МУЛЬТИПЛЕКСОР), что значение NALUSizeLength равно 2. - person szatmary; 12.08.2013
comment
Я не могу установить его, потому что я использую Win 7 и минимально необходимый клиент для установки размера NALU на кодировщике - это Win 8. Но все же в документации говорится, что кодировщик можно использовать и на Win 7. И люди действительно используют его на Win 7. - person user1764961; 12.08.2013