Wykres dzwieku...

0

czesc
juz szukalem ale niec nie znalazlem...
jak zrobic wykres glosnosci dzwieku od razu dla calego pliku mp3?
tak jak jest w programach do obrobki:
http://www.exelbonsai.com/Downloads/database/audio_video/audio/images/Audiacity%201.jpg

zastanawialem sie czy by nie przekonwertowac mp3 do wav (jakims malym osobnym programem), bo wav ma duzo prostsza budowe i potem mozna po takim pliku przejechac petla i zrobic wykres.. ale czy nie ma <ort>prostrzej </ort>metody?

0

znam bassa, ale nie o to mi chodzi.
w bassie potrafie tylko zrobic żeby rysowalo wygres w czasie odtwarzania, wiec jesli mp3 trwa np 6 minut to nie bede rysowal wykresu tak dlugo.

0

Musisz skonwertować MP3 do WAV, który nie jest niczym innym jak zbiorem (powiedzmy tablicą) amplitud kolejnych próbek w poszczególnych kanałach.

0

no to tak chyba bede musial zrobic....
jakies zrodla? ;]

dzieki z gory [browar]
pozdrawiam

0

albo nie... a co tam... sam sobie napisze :-)
ale byl bym baaaardzo wdzieczny, jak by ktos podal jakies dobre zrodlo informacji na temat budowy plikow wav ;]

0

nie, jednak nie.... :-D

faktycznie udalo mi sie to zrobic bassem, ale na pelne (prawie) rozwiazanie natknalem sie bardzo przypadkowo: analizujac kod zrodlowy zapisywania mp3 do wav (writewav -w przykladowych zrodlach bass'a). troche go przerobilem na wlasne potrzeby i dziala swietnie:

var h, volume:DWORD;
begin

h := BASS_StreamCreateFile(FALSE, PChar(SourceFileName), 0, 0, BASS_STREAM_DECODE);

	while (BASS_ChannelIsActive(h) > 0) do
         begin
         volume:=BASS_ChannelGetLevel(h);
                Chart1.Series[0].Add(volume);

         Application.ProcessMessages; //niby niepotrzebne bo tylko spowalnia

         PercentDone := Trunc(100 * (BASS_ChannelGetPosition(h) / BASS_ChannelGetLength(h)));
         ProgressBar.Position := PercentDone;
         LabelOp.Caption      := 'Done ' + IntToStr(PercentDone) + '%';
	end;
   BASS_StreamFree(h);
end;

jesli ktos bedzie chcial tego kiedys uzyc to dla wyjasnienia powiem jeszcze, ze wywolanie BASS_ChannelGetLevel() powoduje przesuniecie pozycji o +20ms.
dlatego petla bedzie wywolana (dlugosc_dzwieku[ms] / 20) razy.

pozdrawiam [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1