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