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.
In der mailinglist bekomme ich leider immer nur gesagt: "so und so müsste es gehen"
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 und in anderen c++ Foren bekomme ich keine Antwort.
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
Alles anzeigen