Forum: Mikrocontroller und Digitale Elektronik Stm32F7 Helix mp3 Decoder


von chris (Gast)


Lesenswert?

Hallo,

kennt sich hier jemand mit dem Helix Mp3-decoder aus?
Ich möchte auf einem STM32F7 Discovery einen MP3 Datenstrom (webradio) 
in wave umwandeln und dann ausgeben.

Ich habe als Vorlage die Version
http://vedder.se/2012/07/play-mp3-on-the-stm32f4-discovery/

verwendet. In dieser Datei ist eine mp3_data.c, in welcher ein MP3 Daten 
array ist.

Nun habe ich versucht, die Funktionen im Beispielprojekt BSP-Audio-Play 
für die Ausgabe so zu belassen wie sie sind.

Wie kann ich dann das MP3 Array umwandlen, um dieses an die 
BSP_Audio_Out Funktion zu geben?

Im wesentlichen passiert dies doch alles in dieser Funktion, oder?






/*********************************************************************** 
***************
 * Function:    MP3Decode
 *
 * Description: decode one frame of MP3 data
 *
 * Inputs:      valid MP3 decoder instance pointer (HMP3Decoder)
 *              double pointer to buffer of MP3 data (containing headers 
+ mainData)
 *              number of valid bytes remaining in inbuf
 *              pointer to outbuf, big enough to hold one frame of 
decoded PCM samples
 *              flag indicating whether MP3 data is normal MPEG format 
(useSize = 0)
 *                or reformatted as "self-contained" frames (useSize = 
1)
 *
 * Outputs:     PCM data in outbuf, interleaved LRLRLR... if stereo
 *                number of output samples = nGrans  nGranSamps  
nChans
 *              updated inbuf pointer, updated bytesLeft
 *
 * Return:      error code, defined in mp3dec.h (0 means no error, < 0 
means error)
 *
 * Notes:       switching useSize on and off between frames in the same 
stream
 *                is not supported (bit reservoir is not maintained if 
useSize on)
 ************************************************************************ 
**************/
int MP3Decode(HMP3Decoder hMP3Decoder, unsigned char **inbuf, int 
*bytesLeft, short *outbuf, int useSize)






Problem, die Funktion hängt sich an einer mir unbekannten stelle auf.
Aber von der Logik her könte ich dann den "outbuf" pointer als die 
Startadresse der abzuspielenden Wave Datei betrachten?

Liebe Grüße!

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Versuch ich mal zu antworten ...

Die Dekoder-Schleife sieht in etwa so aus:
1
int filesize = fread(mp3buffer, 1, 1024*1024, fileread);
2
3
while (filesize) {
4
    int offset = MP3FindSyncWord(mp3buffer, filesize);
5
    if (offset < 0) {
6
       // wahrscheinlich file zuende
7
       break;
8
    }
9
    mp3buffer+=offset;
10
    filesize-=offset;
11
    if (!MP3Decode(mp3dec, (uint8_t**) &mp3buffer, (int*) &filesize, (int16_t*) audiodata, 0)) {
12
            MP3GetLastFrameInfo(mp3dec, &mp3info);
13
            // in mp3info.outputSamps steht, wieviel audio-samples dekodiert wurden
14
    } else {
15
        //error
16
    }
17
}

Im Prinzip läuft es so:

Man sucht sich das Sync-Wort. Mit der Information, wo es ist, passt man 
den Pointer auf die MP3-Daten an und gibt es dem Dekoder.

Dann lässt man den Dekoder dekodieren ... Zu beachten ist, der Dekoder 
verändert den mp3buffer und filesize. mp3buffer zeigt dann auf das erste 
Byte nach dem MP3-Frame und filesize wurde entsprechend verkleinert.

Die Kunst ist jetzt, das ganze platzsparend abzuarbeiten ... Wenn du 
soviel Speicher hast, wie dein MP3 groß ist, kannst du das in ein Stück 
in den RAM laden - bei meinem letzten Projekt hatte ich es in 8kB-Chunks 
aufgeteilt.

Und die Error-Behandlung ist auch noch anspruchsvoll ...

*edit*: Ah gerade gesehen, ein Gast hat gepostet ... Dann war die Arbeit 
wohl umsonst ;-)

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

hallo, habe das decodieren inzwischen hinbekommen, bin nun einen schritt 
weiter.

beim stm32f7 hab ich leider nicht genug ram für das ganze mp3 stück.

danke dennoch für die antwort

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.