Как использовать MediaStreamSource для воспроизведения кадров h264 из файла matroska? - PullRequest
2 голосов
/ 10 апреля 2009

Я пытаюсь визуализировать кадры из файла mkv h264 в silverlight 3 с помощью MediaStreamSource. Разбор файла mkv - это нормально, но я борюсь с ожидаемыми значениями CodecPrivateData в SL, который должен быть строкой, в то время как информация PrivateData из mkv является двоичным элементом. Кроме того, я не уверен в том, в какой форме кадры должны быть переданы SL (то есть, как они хранятся в mkv / mp4 или транскодируются как NALU) У кого-нибудь есть информация по этому поводу?

Ответы [ 3 ]

4 голосов
/ 01 мая 2011

После аналогичных проблем, с которыми я часто сталкиваюсь, я могу ответить на этот вопрос.

  • В ReportOpenMediaCompleted () при настройке описания видеопотока можно игнорировать строку атрибута CodecPrivateData, несмотря на то, что говорится в документации. Это не обязательно. (при условии, что ваш поток единиц NAL включает единицы SPS и PPS)

  • Вы должны отправить один блок NAL обратно в MediaElement для каждого запроса GetSampleAsync (). Это включает в себя не NAL единицы изображения, например SPS / PPS единиц.

  • Когда вы отправляете свои блоки NAL, убедитесь, что в начале каждого есть 3-байтовые коды запуска (0x00 0x00 0x01). (Это похоже на формат «Приложения B», но не совсем то же самое)

  • В ReportGetSampleCompleted () установите значение «Смещение», равное началу начального кода NAL, а не фактическим данным. (в большинстве случаев это будет ноль, при условии, что вы используете свежий поток на единицу NAL)

У меня есть небольшой блог об опыте здесь , и я надеюсь добавить в блог больше.

0 голосов
/ 24 июля 2012

В соответствии с документацией личные данные кодека должны быть установлены в 00000001 + sps + 00000001 + pps. Однако документация неверна значение CodecPrivateData, похоже, полностью игнорируется. Вместо этого вам нужно передать SPS и PPS NALS (с заголовком приложения b, конечно) в качестве первого и второго результата GetSampleAsync.

Для обычных образцов носителей нормальные 4-байтовые заголовки приложения b заголовки работают просто отлично

0 голосов
/ 29 мая 2009

CodecPrivateData - это содержимое атома 'avcC', который является потомком атома 'stsd' в файле MP4. Вы должны преобразовать двоичные данные в строку. Это будет выглядеть примерно так: "014D401FFFE10017674D401F925402802DD0800000030080000018478C195001000468EE32C8"

Вы также должны заменить длины mkv / mp4 на NALU. Я написал немного об этом (чтобы Smooth Streaming работал для файлов H.264).

С уважением,

См .: Smooth Streaming H264

...