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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.