Нужна помощь(VWF+DirectShow)(VC++ 2003)

 
Начать новую тему   Ответить на тему    Список форумов DirectShow форум -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
Tors
Активный


Зарегистрирован: 16.11.2006
Сообщения: 25
Откуда: Харьков

СообщениеДобавлено: Чт Май 24, 2007 9:56 am    Заголовок сообщения: Нужна помощь(VWF+DirectShow)(VC++ 2003) Ответить с цитатой

Есть проект на VC++ 2003.
Класс читает видео и звук из файлов, используя интерфейсы DirectShow.
Для тестировани сделана программа,
которая используя этот класс, сохраняет видео в AVI.

Тестовая программа должна сохранить видео с кодеком xvid, звук pcm,(VFW)

ОСНОВНАЯ ПРОБЛЕМА:
звук.
Для некоторых исходных файлов звук в результирующий AVI пишется нормально.
Для некоторых искажается.
А для некоторых его просто нет
(хотя граф для полученного avi строится нормально :
есть и видео ветка, и аудио
(проверено в GraphEdit)
Вероятно я накрутил с параметрами звука
при работе с VFW API

второстепенная проблема
Если пработать только с незжатым видео, проблем особых нет.
Но проблемы при работе с компрессед стрим.
(Я применил метод научного тыка и
выяснил, что кодек xvid(для vfw)
понимает только RGB24)
Если удастся прикрутить другие медиасубтайпы
(например Y41P)
к xvid будет просто замечательно

Уважаемые знатоки VFW
(хотя возможно нужно будет
поправить и DShow часть проекта для звука)
помогите за пиво или за $

Свои предложения и соображения шлите
на мыло
torsar[ухо]gmail.com
или отвечайте в форум
на этот топик

со своей стороны
вышлю спецификацию класса
и проект на VС++
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
AndrеySol
Активный


Зарегистрирован: 27.02.2007
Сообщения: 57

СообщениеДобавлено: Пт Май 25, 2007 1:07 am    Заголовок сообщения: Ответить с цитатой

Интересно было-бы посмотреть граф который пишет у Вас AVI-шку - какие кодеры, мультиплексор и конечный фильтр использованы ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Tors
Активный


Зарегистрирован: 16.11.2006
Сообщения: 25
Откуда: Харьков

СообщениеДобавлено: Пт Май 25, 2007 5:42 pm    Заголовок сообщения: Корректно ли так делать? Ответить с цитатой

C vfw расчехлился,
нашел пример.
Походу проблема не в этом.

Получаю с помощью DShow и SampleGrabber
слепки звука в буфер :


Код:

bool CVideoReader::ReadAudio(DWORD dwSamples, void** ppAudio)
{
    HRESULT hr;
    DWORD bps=this->GetBitsPerSample();
    DWORD smplsize=bps/8;
    DWORD TotalBytes=smplsize*dwSamples;
    long cbBuffer = 0;
    BYTE *buffer=NULL;
    DWORD Shift=0;
    BYTE *pMainBuf=new BYTE[TotalBytes];
    DWORD Bytes=TotalBytes;
   
    while(TRUE)
    {
        hr=SampleGrabber4Audio->GetCurrentBuffer(&cbBuffer,NULL);
       
pBuffer=new BYTE[cbBuffer];
        hr=SampleGrabber4Audio->GetCurrentBuffer(&cbBuffer,(long *)pBuffer);
        if(cbBuffer>=Bytes)
        {
            memcpy(pMainBuf+Shift,pBuffer,Bytes);
            delete pBuffer;
            DWORD SkipSamples=Bytes/smplsize;
            BOOL Res=this->SkipAudio(SkipSamples);
            if(!Res)
            {
                delete pMainBuf;
                return FALSE;
            }
            break;
        }
        else
        {
            Bytes-=cbBuffer;
            memcpy(pMainBuf+Shift,pBuffer,cbBuffer);
            Shift+=cbBuffer;
            delete pBuffer;
            DWORD SkipSamples=cbBuffer/smplsize;
            BOOL Res=this->SkipAudio(SkipSamples);
            if(!Res)
            {
                delete pMainBuf;
                return FALSE;
            }
        }
    }
    (*ppAudio)=new BYTE[TotalBytes];
    memcpy((*ppAudio),pMainBuf,TotalBytes);
    delete pMainBuf;
    return TRUE;
}



А затем пишу буферы с помощью VFW
в AVI-файл.
(также пишу видео — тут проблем нет)
Для некоторых исходных файлов
(mono)
все ok.
Для некоторых звук урывками
А для некоторых звук искажен
(для stereo попробовал кучу файлов — звук всегда искажен)

Я не знаю каким макаром звук хранится в видеофайлах
корректно ли брать последовательно сэмплы звука из файла(DShow, SampleGrabber)
а потом писать(VFW) в avi
(особенно для стерео)

И еще вопросики:

Правильно ли я расчитываю количество сэмплов звука по времени?
(c учетом количества каналов mono/stereo)
IMediaSeeking получен у GraphBuilder,
Соответственно время берется для видео
(я так думаю время для видео и аудио
в одном файле совпадает всегда?)


Код:
hr=AudioMediaSeeking->IsFormatSupported(&TIME_FORMAT_MEDIA_TIME);
   
    hr=AudioMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
   
    LONGLONG d;
    hr=AudioMediaSeeking->GetDuration(&d);
   
        double Sec=d/(1000000000.0/100.0);
    DWORD Smpls=Sec*(double)(Info.AudioInf.nSamplesPerSec*Info.AudioInf.nChannels);
    return Smpls;


Правильно ли я расчитываю текущий сэмпл звука по вреемени?

Код:
DWORD CVideoReader::GetCurSample()
{
    HRESULT hr;
    hr=AudioMediaSeeking->IsFormatSupported(&TIME_FORMAT_MEDIA_TIME);
    hr=AudioMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
   
        LONGLONG d;
    hr=AudioMediaSeeking->GetCurrentPosition(&d);
   
        double Sec=(double)d/(1000000000.0/100.0);
    double Smpls=Sec*(double)(Info.AudioInf.nSamplesPerSec*Info.AudioInf.nChannels);
    DWORD dwSmpls=Smpls+1;
    return dwSmpls;



Если нужно проскочить определенное количество сэмплов,
правильно ли?

Код:
bool CVideoReader::SkipAudio(DWORD dwSamples)
{
    HRESULT hr;
    DWORD cursmpl=GetCurSample();
    DWORD ressmpl=cursmpl+dwSamples;
    DWORD smplcnt=GetSamplesCount();
    if(ressmpl>smplcnt) return FALSE;
    hr=AudioMediaSeeking->IsFormatSupported(&TIME_FORMAT_MEDIA_TIME);
   
    hr=AudioMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
   
        double sec=(double)ressmpl/(double)(Info.AudioInf.nSamplesPerSec*Info.AudioInf.nChannels);
    double nSec=sec*(1000000000.0/100.0);
    LONGLONG Pos=nSec;
    hr=AudioMediaSeeking->SetPositions(&Pos,
                                            AM_SEEKING_AbsolutePositioning,
                                            NULL,
                                            AM_SEEKING_NoPositioning
                                            );
   


}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Tors
Активный


Зарегистрирован: 16.11.2006
Сообщения: 25
Откуда: Харьков

СообщениеДобавлено: Сб Май 26, 2007 2:17 pm    Заголовок сообщения: Ответить с цитатой

>Есть проект на VC++ 2003.
T>Класс читает видео и звук из файлов, используя интерфейсы DirectShow.
T>Для тестировани сделана программа,
T>которая используя этот класс, сохраняет видео в AVI.

T>Тестовая программа должна сохранить видео с кодеком xvid, звук pcm,(VFW)

T>ОСНОВНАЯ ПРОБЛЕМА:
T>звук.
T>Для некоторых исходных файлов звук в результирующий AVI пишется нормально.
T>Для некоторых искажается.
T>А для некоторых его просто нет
T>(хотя граф для полученного avi строится нормально :
T>есть и видео ветка, и аудио
T>(проверено в GraphEdit)
Вероятно прблема все таки с DShow-частью
проекта для звука.



Уважаемые знатоки DShow
помогите за пиво или за $

T>Свои предложения и соображения шлите
T>на мыло
T>torsar[ухо]gmail.com
T>или отвечайте в форум
T>на этот топик

T>со своей стороны
T>вышлю спецификацию класса
T>и проект на VС++

С VFW частью проекта я расчехлился
(Нашел пример — оказалось, что делаю я все правильно)
Осталась DShow часть проекта для звука.
Помогите разобраться за $.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов DirectShow форум -> Общий Часовой пояс: GMT + 4
Страница 1 из 1
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB


Рейтинг@Mail.ru