Microsoft FileSink Mpeg4 - PullRequest
       130

Microsoft FileSink Mpeg4

0 голосов
/ 29 января 2019

У меня 2 вопроса

1) Как записать необработанные данные в файл-приемник.Я пытаюсь мультиплексировать.2) Как убедиться, что поглощенные данные записываются не в файл, а в буфер памяти

Подробно:

Я пытаюсь использовать Windows MPEG-4 File Sink для записикакой-нибудь Intel SDK закодировал avc или hevc в память и отправил в websocket.

Каков правильный подход?

Могу ли я просто подать необработанный hevc или avc as (в байтах *, длину) в приемник файлов MPEG-4?Или мне нужно обернуть Intel Encoder в пользовательский кодировщик Windows Media Foundation (ну, в любом случае, я могу просто использовать GUID для получения Intel Encoder) из работы Windows Media Frame.Поправьте меня, если я ошибаюсь, пожалуйста.

Итак, у меня 2 проблемы. Как записать мои необработанные данные (avc || hevc) в MP4 Sinker (кодируется сторонним кодером)

Нужно ли реализовывать пользовательский Sinker?И как это принято.Могу ли я наследовать часть MPEG4 Sinker (В конце концов, я не хочу повторно реализовывать полный контейнер для Mp4)

Или изменить поведение MPEG4 Sinker, чтобы он не записывал его в файл, а записывал в память

Я знаю, что чувствую, что повторюсь несколько раз.Извини за это.

1 Ответ

0 голосов
/ 29 января 2019

1) Если вы закодируете закодированный поток битов в IMFSample , вы можете просто вызвать IMFStreamSink :: ProcessSample .Чтобы обернуть его в IMFSample, создайте буфер памяти IMFMediaBuffer с MFCreateMemoryBuffer , затем создайте IMFSample с MFCreateSample и добавьте в него буфер с помощью IMFSample:: AddBuffer .И затем передайте это потоку.Кроме того, если вы можете ограничить длину выходного битового потока, вы можете использовать базовый memofy из IMFMediaBuffer, используя IMFMediaBuffer :: Lock , чтобы получить указатель на базовую память и передать его в Intel SDK.

2) При создании приемника MPEG-4 через MFCreateMPEG4MediaSink вы передаете экземпляр IMFByteStream .Вы можете создать свой собственный класс, который реализует этот интерфейс и записывает данные непосредственно в память или куда вам нужно.Если вы не хотите делать полную реализацию, есть также MFCreateMFByteStreamOnStream и MFCreateMFByteStreamOnStreamEx , которые могут обернуть IStream экземпляр в IMFByteStream, но я никогда не использовалте, и я не знаю о семантике памяти.Вы можете создать память с поддержкой IStream с помощью SHCreateMemStream и CreateStreamOnHGlobal .

Я использовал Intel SDK довольно давно, но если я помню, у него был MFT-совместимый кодировщик, но я всегда использовал простой C ++, и поэтому я не уверен, насколько они отличаются с точки зрения конфигурации и т. д. Но если MFT один работает, то вы можете настроить надлежащий конвейер, не обрабатывая образцы битового потока самостоятельно, как указано в (1) и просто обработайте (2).

Кроме того, с точки зрения производительности, поскольку, насколько я помню, Intel SDK работал и на поверхностях Direct3D, вы можете посмотреть MFCreateDXSurfaceBuffer для используемых поверхностей Direct3Dвместо буферов памяти для переноса данных.

...