2009-04-09 1 views
2

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

ответ

0

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

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

С уважением,

См: Smooth Streaming H264

4

После подобных проблем моей и много головной царапать, я могу ответить на этот вопрос.

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

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

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

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

У меня есть blogged a little about the experience here и надеемся на блог больше.

0

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

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

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