Microsoft FileSink Mpeg4

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

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

Итак, подробно:

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

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

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

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

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

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

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

1 ответ

Решение

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 вместо буферов памяти для обертывания данных.

Другие вопросы по тегам