получение информации о MPEG1, MPEG2 файлах
От: sikro  
Дата: 05.06.07 14:59
Оценка:
Здравствуйте!

Задача состоит в следующем. Необходимо разработать код. На вход подается файл mpeg1 или mpeg2. Код его анализирует и выдает информацию о нем (ширина картинки, высота картинки, bitrate и т.д.). Хотелоcь бы это дело реализовать средствами DirectShow. DirectShow, как говорится, мы только начинаем осваивать, а информации в DirectShow SDK документации огромное количество...

Подскажите, пожалуйста, направление, в котором можно работать, что бы решить задачу. Заранее спасибо.
Re: получение информации о MPEG1, MPEG2 файлах
От: Left2 Украина  
Дата: 05.06.07 15:22
Оценка:
S>Подскажите, пожалуйста, направление, в котором можно работать, что бы решить задачу. Заранее спасибо.

Рой в сторону примеров использования интерфейса IMediaDet.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: получение информации о MPEG1, MPEG2 файлах
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 06.06.07 09:38
Оценка:
Здравствуйте, Left2, Вы писали:

L>Рой в сторону примеров использования интерфейса IMediaDet.


С МПЕГ 2 ждёт крутой облом...
Re[3]: получение информации о MPEG1, MPEG2 файлах
От: squid  
Дата: 06.06.07 10:44
Оценка:
Здравствуйте, Денис Майдыковский, Вы писали:

ДМ>Здравствуйте, Left2, Вы писали:


L>>Рой в сторону примеров использования интерфейса IMediaDet.


ДМ> С МПЕГ 2 ждёт крутой облом...


почему? та инфа что он сказал вроде вполне получается...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: получение информации о MPEG1, MPEG2 файлах
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 06.06.07 10:53
Оценка: +1
Здравствуйте, squid, Вы писали:

S>Здравствуйте, Денис Майдыковский, Вы писали:


S>почему? та инфа что он сказал вроде вполне получается...


Это значит в системе завёлся сторонний сплиттер. Стандарные сплиттеры выдают информацию в формате VIDEOINFO2, а IMediaDet понимает только VIDEOINFO.
Re[5]: получение информации о MPEG1, MPEG2 файлах
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 06.06.07 11:35
Оценка:
ДМ>Это значит в системе завёлся сторонний сплиттер. Стандарные сплиттеры выдают информацию в формате VIDEOINFO2, а IMediaDet понимает только VIDEOINFO.

А кто мешает понимать нужный формат?
Что-то вроде
    CComPtr<IMediaDet> pDet;
    pDet.CoCreateInstance(CLSID_MediaDet);
    CComBSTR bstrFilename(fname);
    pDet->put_Filename(bstrFilename);
    long nstr=0;
    pDet->get_OutputStreams(&nstr);
    for(long i=0;i<nstr;i++) {
        GUID major_type;
        if (FAILED(pDet->put_CurrentStream(i)))
            continue;
        if (FAILED(pDet->get_StreamType(&major_type)))
            continue;
        if (major_type == MEDIATYPE_Video) {
            long width = 0, height = 0; 
            CMediaType mt;
            pDet->get_StreamMediaType(&mt);
            memcpy(&fourcc, &mt.subtype, 4);
            if ((mt.formattype == FORMAT_VideoInfo) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER))) {
                VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat);
                width = pVih->bmiHeader.biWidth;
                height = pVih->bmiHeader.biHeight;        
            } else 
            if ((mt.formattype == FORMAT_MPEG2Video) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER2))) {
                VIDEOINFOHEADER2 *pVih = (VIDEOINFOHEADER2*)(mt.pbFormat);
                width = pVih->bmiHeader.biWidth;
                height = pVih->bmiHeader.biHeight;        
            } else 
                continue;
            if (height < 0) height *= -1;
            w = width;
            h = height;    
            return TRUE;
        }// if video stream
    }//for each stream
Re[6]: получение информации о MPEG1, MPEG2 файлах
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 06.06.07 12:30
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>А кто мешает понимать нужный формат?

DM>Что-то вроде

Возможно я путаю с режимом получения кадров, вот их-то точно из MPEG2 IMediaDet не умеет вытаскивать по описаной выше причине.
Re[6]: получение информации о MPEG1, MPEG2 файлах
От: Аноним  
Дата: 07.06.07 07:34
Оценка:
Здравствуйте, D. Mon, Вы писали:

ДМ>>Это значит в системе завёлся сторонний сплиттер. Стандарные сплиттеры выдают информацию в формате VIDEOINFO2, а IMediaDet понимает только VIDEOINFO.


DM>А кто мешает понимать нужный формат?

DM>Что-то вроде
DM>
DM>    CComPtr<IMediaDet> pDet;
DM>    pDet.CoCreateInstance(CLSID_MediaDet);
DM>    CComBSTR bstrFilename(fname);
    pDet->>put_Filename(bstrFilename);
DM>    long nstr=0;
    pDet->>get_OutputStreams(&nstr);
DM>    for(long i=0;i<nstr;i++) {
DM>        GUID major_type;
DM>        if (FAILED(pDet->put_CurrentStream(i)))
DM>            continue;
DM>        if (FAILED(pDet->get_StreamType(&major_type)))
DM>            continue;
DM>        if (major_type == MEDIATYPE_Video) {
DM>            long width = 0, height = 0; 
DM>            CMediaType mt;
            pDet->>get_StreamMediaType(&mt);
DM>            memcpy(&fourcc, &mt.subtype, 4);
DM>            if ((mt.formattype == FORMAT_VideoInfo) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER))) {
DM>                VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat);
DM>                width = pVih->bmiHeader.biWidth;
DM>                height = pVih->bmiHeader.biHeight;        
DM>            } else 
DM>            if ((mt.formattype == FORMAT_MPEG2Video) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER2))) {
DM>                VIDEOINFOHEADER2 *pVih = (VIDEOINFOHEADER2*)(mt.pbFormat);
DM>                width = pVih->bmiHeader.biWidth;
DM>                height = pVih->bmiHeader.biHeight;        
DM>            } else 
DM>                continue;
DM>            if (height < 0) height *= -1;
DM>            w = width;
DM>            h = height;    
DM>            return TRUE;
DM>        }// if video stream
DM>    }//for each stream
DM>



С IMediaDet вроде бы разобрались. Есть одно НО. DirectShow теперь входит в Platform SDK, что собственно нам на руку, а вот IMediaDet подключает хедер qedit.h. При компиляции этот qedit.h пытается подтянуть ещё
некий dxtrans.h. А вот его уже нет в Platform SDK и находится он в DirectX 9.0 SDK, из-за чего приходится
тянуть ещё и DirectX. Нет ли способа обойти эту проблему?
Re: получение информации о MPEG1, MPEG2 файлах
От: fuzzz Беларусь  
Дата: 08.06.07 07:59
Оценка:
Здравствуйте, sikro, Вы писали:

S>Здравствуйте!


S>Задача состоит в следующем. Необходимо разработать код. На вход подается файл mpeg1 или mpeg2. Код его анализирует и выдает информацию о нем (ширина картинки, высота картинки, bitrate и т.д.). Хотелоcь бы это дело реализовать средствами DirectShow. DirectShow, как говорится, мы только начинаем осваивать, а информации в DirectShow SDK документации огромное количество...


S>Подскажите, пожалуйста, направление, в котором можно работать, что бы решить задачу. Заранее спасибо


С IMediaDet вроде бы разобрались. Есть одно НО. DirectShow теперь входит в Platform SDK, что собственно нам на руку, а вот IMediaDet подключает хедер qedit.h. При компиляции этот qedit.h пытается подтянуть ещё
некий dxtrans.h. А вот его уже нет в Platform SDK и находится он в DirectX 9.0 SDK, из-за чего приходится
тянуть ещё и DirectX. Нет ли способа обойти эту проблему?.
Re[7]: получение информации о MPEG1, MPEG2 файлах
От: squid  
Дата: 08.06.07 18:26
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, D. Mon, Вы писали:


ДМ>>>Это значит в системе завёлся сторонний сплиттер. Стандарные сплиттеры выдают информацию в формате VIDEOINFO2, а IMediaDet понимает только VIDEOINFO.


А>С IMediaDet вроде бы разобрались. Есть одно НО. DirectShow теперь входит в Platform SDK, что собственно нам на руку, а вот IMediaDet подключает хедер qedit.h. При компиляции этот qedit.h пытается подтянуть ещё

А>некий dxtrans.h. А вот его уже нет в Platform SDK и находится он в DirectX 9.0 SDK, из-за чего приходится
А>тянуть ещё и DirectX. Нет ли способа обойти эту проблему?

ага блин. их еще и покоцали. части демок нету. а вообще здесь есть сжатый SDK с самым необходимым. ~20 Mb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: получение информации о MPEG1, MPEG2 файлах
От: Аноним  
Дата: 16.06.07 22:40
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>А кто мешает понимать нужный формат?

DM>Что-то вроде
DM>
DM>    CComPtr<IMediaDet> pDet;
DM>    pDet.CoCreateInstance(CLSID_MediaDet);
DM>    CComBSTR bstrFilename(fname);
    pDet->>put_Filename(bstrFilename);
DM>    long nstr=0;
    pDet->>get_OutputStreams(&nstr);
DM>    for(long i=0;i<nstr;i++) {
DM>        GUID major_type;
DM>        if (FAILED(pDet->put_CurrentStream(i)))
DM>            continue;
DM>        if (FAILED(pDet->get_StreamType(&major_type)))
DM>            continue;
DM>        if (major_type == MEDIATYPE_Video) {
DM>            long width = 0, height = 0; 
DM>            CMediaType mt;
            pDet->>get_StreamMediaType(&mt);
DM>            memcpy(&fourcc, &mt.subtype, 4);
DM>            if ((mt.formattype == FORMAT_VideoInfo) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER))) {
DM>                VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat);
DM>                width = pVih->bmiHeader.biWidth;
DM>                height = pVih->bmiHeader.biHeight;        
DM>            } else 
DM>            if ((mt.formattype == FORMAT_MPEG2Video) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER2))) {
DM>                VIDEOINFOHEADER2 *pVih = (VIDEOINFOHEADER2*)(mt.pbFormat);
DM>                width = pVih->bmiHeader.biWidth;
DM>                height = pVih->bmiHeader.biHeight;        
DM>            } else 
DM>                continue;
DM>            if (height < 0) height *= -1;
DM>            w = width;
DM>            h = height;    
DM>            return TRUE;
DM>        }// if video stream
DM>    }//for each stream
DM>


Пробовал, не работает. Выдаёт на видео и аудио совершенно немыслимый StreamType, идентификатора которого нигде не прописано, а StreamMediaType для видео и аудио получается WAVEFORMATEX. Да и в SDK сказано, что со мпежками Медиадет не дружит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.