Как узнать majortype и subtype в видео файле?
От: Hanike  
Дата: 31.10.07 20:08
Оценка:
Записываю фидео файл в базу как BLOB.
Теперь надо воспроизвести от туда, а как вытащить из набора байтов
majortype, subtype и прочее для AM_MEDIA_TYPE ума не приложу.
Была идея писать эти параметры в базу вместе с блобом при сохранении файла в базу,
но так тоже не всё чисто.
Одним словом надо всё это вытащить при чтении файла из базы.
Ведь проигрыватели это как-то делают?
Re: Как узнать majortype и subtype в видео файле?
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 01.11.07 07:06
Оценка:
Файл какого формата? Если формат известен (AVI, например), несложно распарсить заголовок.
Чем воспроизвести? Может, вопроизводилка сама все определит?
Re[2]: Как узнать majortype и subtype в видео файле?
От: Hanike  
Дата: 01.11.07 09:10
Оценка:
Здравствуйте, D. Mon.

Воспроизвожу графом из дайрект шоу, подключая свой фильтр в начало цепочки.
Сейчас именно распарсивая заголовки и решаю проблему, но всех типовов медиа файлов я не знаю.
Может какие-нибудь модули/фильтры существуют, которым на вход поток байтов(не потоковое видео),
а они это уже бы дальше передавали?
Re[3]: Как узнать majortype и subtype в видео файле?
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 01.11.07 11:11
Оценка:
Сделайте свой фильтр аналогом File Source (Async/URL). Он будет выдавать некий Stream, а разбирать его и проигрывать уже будут соответствующие механизмы DirectShow.
Re[4]: Как узнать majortype и subtype в видео файле?
От: Hanike  
Дата: 01.11.07 18:23
Оценка:
Я примерно так и делаю(сокращённый псевдо код):

// Взять стрим из базы
CComPtr<ISequentialStream> spSeqStream = GetBlob(guidMediaSubType);


// Вытащить типы по смещению
CMediaType mt;
ref_ptr<char> rpData(new char[12]);
ZeroMemory(rpData.get(), 12);
ULONG cb = 11;
hrs = spSeqStream->Read(rpData.get(), cb, &cb);
// Здесь руками по смещению вытаскиваю типы
mt = SelectMediaType(rpData.get()+8);


// Перевод потока из ISequentialStream в IStream
CComPtr<IStream> spStream = StreamFromSeqStream(spSeqStream);


// Создание фильтра
m_pStream = new CFileStream(spStream, GetSize());
CBaseFilter* spMyFilter= new CMemReader(m_pStream, &mt, (HRESULT*)&hrs);


// Само воспроизведение потока
hrs = CoCreateInstance( CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IFilterGraph,
(void**) &m_spFGraf);


hr = m_spFGraf->AddFilter(spMyFilter, NULL);

CComQIPtr<IGraphBuilder> spBuilder(m_spFGraf);

hr = spBuilder->Render(spMyFilter->GetPin(0));


Если структура CMediaType заполнена верно — будет воспроизведение.
Видео файл здесь я распарсиваю сам.
А как сделать так, чтобы автоматом? Т.е. нужен фильтр который принимал бы
обезличенный поток, а вадавал бы поток уже с типами.
Re[4]: Как узнать majortype и subtype в видео файле?
От: Hanike  
Дата: 01.11.07 18:25
Оценка:
Я примерно так и делаю(сокращённый псевдо код):

// Взять стрим из базы
CComPtr<ISequentialStream> spSeqStream = GetBlob(guidMediaSubType);


// Вытащить типы по смещению
CMediaType mt;
ref_ptr<char> rpData(new char[12]);
ZeroMemory(rpData.get(), 12);
ULONG cb = 11;
hrs = spSeqStream->Read(rpData.get(), cb, &cb);
// Здесь руками по смещению вытаскиваю типы
mt = SelectMediaType(rpData.get()+8);


// Перевод потока из ISequentialStream в IStream
CComPtr<IStream> spStream = StreamFromSeqStream(spSeqStream);


// Создание фильтра
m_pStream = new CFileStream(spStream, GetSize());
CBaseFilter* spMyFilter= new CMemReader(m_pStream, &mt, (HRESULT*)&hrs);


// Само воспроизведение потока
hrs = CoCreateInstance( CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IFilterGraph,
(void**) &m_spFGraf);


hr = m_spFGraf->AddFilter(spMyFilter, NULL);

CComQIPtr<IGraphBuilder> spBuilder(m_spFGraf);

hr = spBuilder->Render(spMyFilter->GetPin(0));


Если структура CMediaType заполнена верно — будет воспроизведение.
Видео файл здесь я распарсиваю сам.
А как сделать так, чтобы автоматом? Т.е. нужен фильтр который принимал бы
обезличенный поток, а вадавал бы поток уже с типами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.