Forum: Mikrocontroller und Digitale Elektronik Stm32F7 Helix mp3 Decoder


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von chris (Gast)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.