| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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С++ |
|
| Вернуться к началу |
|
 |
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
);
|
} |
|
| Вернуться к началу |
|
 |
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 часть проекта для звука.
Помогите разобраться за $. |
|
| Вернуться к началу |
|
 |
|
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|
|
|