Witam,
mam dwa problemy i proszę o pomoc bardziej doświadczonych.
Problem 1
Tworzę dwa odzielne strumienie/sample, jeden video drugi audio.
Odtwarzam je z prędkością standardową 25 klatek/s.
Obraz jest idealny. Dźwięk jest zakłócany /trzaski, pyknięcia, z tego co sprawdziłem co 1/25 sekundy. Dlaczego? Co robię źle?
Problem 2
Dlaczego to co zrobiłem /dźwięk/ nie działa pod XP. Działa pod 2000 tylko !!!
Poniżej wkleiłem dwie testowe części kodu.
Otwarcie strumieni:
CoCreateinstance(CLSID_AMMULTIMEDIASTREAM,nil,CLSCTX_INPROC_SERVER,IID_IAMMULTIMEDIASTREAM,AMStream);
MultiByteToWideChar(CP_ACP,0,Pchar(Filename),-1,wPath,Sizeof(wPAth) div sizeof(wPath[0]));
AMStream.Initialize(STREAMTYPE_READ,AMMSF_NOGRAPHTHREAD,nil);
AMStream.AddMediaStream(nil,MSPID_PrimaryAudio,0,AStream);
AMStream.AddMediaStream(Form12.DXDraw1.DDraw.IDraw,MSPID_PrimaryVideo,0,Media);
AMStream.OpenFile(wPAth,AMMSF_NOCLOCK);
MMStream := AMStream;
MMstream.GetMediaStream(MSPID_PrimaryAudio,PrimaryAudStream);
PrimaryAudStream.QueryInterface(IID_IAudioMediaStream,AudioStream);
AudioStream.GetFormat(WaveFormat);
CoCreateInstance(CLSID_AMAudioData,nil,CLSCTX_INPROC_SERVER,IID_IAudioData,AudioData);
SizeBuffer := waveformat.nAvgBytesPerSec div 25;
GetMem(Buffer,SizeBuffer);
AudioData.SetBuffer(SizeBuffer,Buffer,0);
AudioData.SetFormat(waveFormat);
AudioStream.CreateSample(AudioData,0,AudioSample);
WaveOutOpen(@hwo,wave_mapper,@waveformat,DWORD(Self.Handle), DWORD(Self),CALLBACK_WINDOW);
for i := 0 to 1 do
begin
with woh[i] do
begin
lpData := Buffer;
dwBufferLength := SizeBuffer;
dwBytesRecorded := 0;
dwUser := 0;
dwFlags := 0;
dwLoops := 0;
lpNext := nil;
reserved := 0;
end;
waveOutPrepareHeader(hwo,@woh[i],SizeOf(woh[i]));
end;
Wywoływany 25 razy na sekundę update audiosampla:
if assigned(AudioSample) then
begin
if AudioSample.Update(0,0,nil,0) <> S_OK then
begin
waveOutReset(hwo);
waveOutUnprepareHeader(hwo,@woh[0],sizeof(woh[0]));
waveOutUnprepareHeader(hwo,@woh[1],sizeof(woh[1]));
waveOutClose(hwo);
end
else
begin
waveOutWrite(hwo, @woh[0], sizeof(woh[0]));
waveOutWrite(hwo, @woh[1], sizeof(woh[1]));
end;
end;
</b>