Я пытаюсь объединить 2 видео в одно (аудио тоже) и сохранить в виде файла. Скажем, покажите исходное видео в левой половине финального видео, а другой источник справа. Любая кодировка в порядке. Не с DirectShow.
Я подозревал, что IMFVideoMixerControl может быть связан с этим, но, к сожалению, я слишком новичок в MF, чтобы определить правильный шаг для достижения этой цели. Если вы могли бы дать мне некоторое руководство или если какой-либо пример доступен в Интернете, пожалуйста, дайте мне знать. Спасибо за помощь.
IMFVideoMixerControl
используется для рендеринга видео. Вы на правильном пути, глядя на SourceReader.
Вот что я бы сделал:
IMFSourceReader
для каждого источника видео.IMFSinkWriter
и сконфигурируйте его с шириной кадра, равной сумме ширины кадра исходного считывателя.
IMFSourceReader::GetCurrentMediaType
чтобы получить исходные типы медиа.MFGetAttributeSize
с GUID MF_MT_FRAME_SIZE
чтобы получить размеры кадра для каждого типа источника.MFCreateMediaType
и использовать IMFMediaType::CopyAllItems
скопировать атрибуты из источника в типы носителей.MFSetAttributeSize
с GUID MF_MT_FRAME_SIZE
установить увеличенные размеры рамы типа мойки.IMFSinkWriter::AddStream
создать видеопоток, идентичный типу источника, кроме атрибута widthIMFSample
прикрепляя новый IMFMediaBuffer
с увеличенной шириной рамы.MFCopyImage
скопировать каждый из исходных буферов на соответствующую сторону выделенного медиа-буфера.IMFSinkWriter::WriteSample
написать свой IMFSample
в файл приемник.Увидеть этот образец для некоторой базовой обработки SourceReader / SinkWriter, хотя в этом примере вместо файла используется источник захвата видео. Вы можете создать файл SourceReader, используя MFCreateSourceReaderFromURL
вместо MFCreateSourceReaderFromMediaSource
,
Редактировать: Я понял, что вы спросили об аудио тоже. Мой ответ касается только композитинга видео потоков.
Других решений пока нет …