audio verarbeitung mit dem ffmpeg decoder
-
Ich versuche schon seit längerer Zeit mit dem ffmpeg decoder ein Programm zu schreiben das mit den Audiostream analysiert,
Ich komme da nicht wirklich weiter.Beispiele habe ich, nach langem suchen, zwar gefunden, aber die machen leider alle was anderes.
Also zu meinem Problem:
Ich kann zwar ein AudioFrame auslesen und decodieren.
In dem Frame sind dann so ca 1152 AudioSamples drinnen.
Über 4800 Samples (ca 0.1sec) will ich dann den mittelwert der Lautstärke ermitteln.
Die Lautstärke ist dabei die Summe der Quadrate.
Leider finde ich keine Angabe ob ich die 16bit nun noch swappen muss oder nicht.
Ich weiß auch nicht ob die beiden Channels immer im wechsel nacheinander kommen.
Ich habe in der mailingslist einen Tip bekommen das ich immer 32768 abziehen muss.
Das ist wohl der offset. Bin mir da aber nicht sicher.Anbei ein Auszug aus meinem Code.
Ich hoffe echt das es hier jemanden gibt der sich mit sowas auskennt.
Leider gibt es kein ffmpeg Forum.Der Code gibt mir zwar einen Wert, jedoch entspricht das nicht der Lautstärke.
Ich habe ein TestVideo in dem die Lautstärke immer lauter wird.
Mein Code zeigt mir davon jedoch nichts an.while(av_read_frame(pFormatCtx, &packet)>=0) { if(packet.stream_index==audioStream) { count++; len = avcodec_decode_audio(pCodecCtx, (int16_t *)outbuf, &out_size, packet.data, packet.size); if (len < 0) { fprintf(stderr, "Error while decoding\n"); exit(1); } chan1 = 0; chan2 = 0; //lowvalcount = 0; uint8_t *src=outbuf; uint64_t power; for( int i = 0; i < out_size; i+=4) { chan1 = bswap_16(*((int16_t *)src)); //chan1 = *((int16_t *)src); chan2 = bswap_16(*((int16_t *)(src+2))); //chan2 = *((int16_t *)(src+2)); power = ((chan1-32768)*(chan1-32768) + (chan2-32768)*(chan2-32768)) / 2; avg = (avg * c + power ) / (c+1); if (c >= 4800) { // nach 0.1sec den mittelwert ausgeben std::cout << "AudioFrame "<< count <<". " << c << " AudioSamples analysied and the avg loudness is " << avg << std::endl; c=0; avg=0; } c++; src += 4; }//end for }//end if AudioStream }//end While
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hi,
im want to write a program that reads the samples of an audiofile with ffmpeg but its hard to find easy examples.
now i achieved to write it half way but cant use the audio_decode function properly. Do *i* have to allocate the parameters i am passing empty pointers as of now, execpt for pCodecCtx in:avcodec_decode_audio(pCodecCtx, (int16_t *)outbuf, &out_size,
packet.data, packet.size);i am using the latest CVS and a lot of examples seem to use the formal release...
would you be so kind and post how you open a file?
in your posted code i cant see the definitions..i only need to get to the samples thats all...
so im happy as soon as i have a uint16_t* pointer to the samples...
i hope you still read this forum...Thanks in advance!