/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Linke MP3 ind i EXE fil?
Fra : Doe


Dato : 03-08-06 20:14

Jeg har følgende stump kode (tak til Bertel B. for koden). Jeg får afspillet
MP3 filen "test.mp3" og jeg kompilere programmet vha. MinGW og denne
kommando:

g++ demo2.cpp -lvfw32 -o demo2.exe

Er der en måde, at få linket MP3 filen direkte ind i EXE filen således, at
man kun har én fil?


#include <windows.h>
#include <vfw.h>
#include <iostream>
#include <conio.h>

// ---------------------------------------------------------------------------------------------------------------------

int Check_Playing(HWND MciWnd)
{
long Pos;
long Length;
long Speed;
bool Running = true;

Length = MCIWndGetLength(MciWnd);
Pos = MCIWndGetPosition(MciWnd);
Speed = MCIWndGetSpeed(MciWnd);

std::cout << Speed;
if(Pos == Length)
{
MCIWndStop(MciWnd);
Running = false;
}

}
// -----------------------------------------------------------------------------------------------------------------

int main()
{

int key;
key = 0;

HWND MciWnd = MCIWndCreate(0, 0, MCIWNDF_NOTIFYPOS, "");
ShowWindow(MciWnd, SW_HIDE);
MCIWndOpen(MciWnd, "test.mp3", 0);
MCIWndPlay(MciWnd);

bool IsRunning = true;

while(IsRunning && key != 27)
{
if(kbhit())
key = _getch();
std::cout << "\n";
Sleep(10);
IsRunning = Check_Playing(MciWnd);
}
}



 
 
Kent Friis (03-08-2006)
Kommentar
Fra : Kent Friis


Dato : 03-08-06 21:45

Den Thu, 3 Aug 2006 21:13:45 +0200 skrev Doe:
> Jeg har følgende stump kode (tak til Bertel B. for koden). Jeg får afspillet
> MP3 filen "test.mp3" og jeg kompilere programmet vha. MinGW og denne
> kommando:
>
> g++ demo2.cpp -lvfw32 -o demo2.exe
>
> Er der en måde, at få linket MP3 filen direkte ind i EXE filen således, at
> man kun har én fil?

Det kan man sagtens. En mulighed er at lægge den ind som et
char-array. På linux kan det gøres sådan her:

echo 'unsigned char mp3[] = {' > mp3.h
hexdump -v -e '"\t" 8/1 "0x0%02x," "\n"' test.mp3 >> mp3.h
echo '};' >> mp3.h

Du har nok ikke lige de kommandoer til rådighed, men det må nok kunne
lade sig gøre at finde en måde at gøre det på under windows. Om ikke
andet kan man jo skrive et lille program Men resultatet skulle
gerne komme til at se ud noget i retning af:

unsigned char mp3[] = {
0x000,0x000,0x000,0x000,0x0c4,0x000,0x084,0x0dd,
   0x084,0x0c5,0x07c,0x036,0x084,0x0cd,0x084,0x0c7,
   0x07c,0x061,0x07c,0x07d,0x07c,0x07d,0x07c,0x03c,
   0x084,0x0b2,0x07c,0x079,0x07c,0x038,0x084,0x0b2,
   ...
   0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
   0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
   0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,
};

Det bliver en enorm fil, men det kan du jo hurtigt regne ud, når
hver byte fylder så meget (hov, jeg kan se der er et ekstra 0
"0x0..", det behøver du ikke have med. Det er noget jeg har taget
fra et program jeg skrev for mange år siden). I mit tilfælde er
en 36KB wav-fil blevet til 228KB C-kode. Men når det har været
igennem compileren, skulle det gerne komme ned på den oprindelige
størrelse igen.

Et helt andet problem er så hvorvidt du kan afspille MP3-filer
direkte fra et char-array i stedet for en fil.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Michael Rasmussen (03-08-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 03-08-06 22:03

Den Thu, 03 Aug 2006 20:45:25 +0000. skrev Kent Friis:

>
> Et helt andet problem er så hvorvidt du kan afspille MP3-filer
> direkte fra et char-array i stedet for en fil.

FILE* mp3-player = popen("mp3-player", "w");
fprintf(mp3, "%x", mp3);

disclaimer: utested.

Bertel Brander (03-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 03-08-06 22:41

Doe wrote:
> Jeg har følgende stump kode (tak til Bertel B. for koden). Jeg får afspillet
> MP3 filen "test.mp3" og jeg kompilere programmet vha. MinGW og denne
> kommando:

http://damb.dk/zip/mp3test.zip
Dette er et lille test program der linker mp3 filen ind i exe
filen. Programmet afspiller mp3-filen når det køres.
build.bat bygger med MinGW

Det skal lige siges at dette er en meget tidlig beta
version. bit-rate, antal kanaler osv. er hard-kodet,
så hvis du vil bruge andre mp3-filer skal disse
måske justeres.

Formatet står i de første 4 bytes, du kan læse om det her:
http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Doe (03-08-2006)
Kommentar
Fra : Doe


Dato : 03-08-06 23:48

> http://damb.dk/zip/mp3test.zip
> Dette er et lille test program der linker mp3 filen ind i exe
> filen. Programmet afspiller mp3-filen når det køres.
> build.bat bygger med MinGW

Perfekt, mange tak.

> Formatet står i de første 4 bytes, du kan læse om det her:
> http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm

Jeg fik dekodet den medfølgende TEST.MP3 fil til følgende:

TEST.MP3
---------------------------------------------
f f | f 3 | 3 2 | c 0
1111 1111 | 1111 0011 | 0011 0010 | 1100 0000
AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM
---------------------------------------------
A = 111 1111 1111
B = 10 = MPEG Version 2 (ISO/IEC 13818-3)
C = 01 = Layer III
D = 1 = Not protected
E = 0011 = bitrate 24kbit
F = 00 = 22050 Hz (sampling rate)
G = 1 = frame is padded with one extra slot
H = 0 = whatever (private bit)
I = 11 = Single channel (Mono)
J = 00 = bands 4 to 31 (mode extension)
K = 0 = Audio is not copyrighted
L = 0 = Copy of original media
M = 00 = None emphasis

Den fil jeg vil afspille har følgende data:

TEST2.MP3
---------
f f f a 9 0 4 4
1111 1111 | 1111 1010 | 1001 0000 | 0100 0100
AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM
A = 111 1111 1111
B = 11 = MPEG Version 1 (ISO/IEC 11172-3)
C = 01 = Layer III
D = 0 = Protected by CRC (16bit crc follows header)
E = 1001 = 128 kbit
F = 00 = 44100 Hz (sampling rate)
G = 0 = frame is not padded
H = 0 = whatever (private bit)
I = 01 = Joint stereo (Stereo)
J = 00 = bands 4 to 31 (mode extension)
K = 0 = Audio is not copyrighted
L = 1 = Original media
M = 00 = None emphasis

... så jeg skal lige have fundet alle stederne, hvor det skal ændres
Sample raten var ikke nok at ændre, så der er jo nok nogle af de andre kald
der skal ændres. Det kan selvfølgelig også være, at der skal ekstra/andre
kald ind i.fb. med at der er "protected by CRC"?

Kender du også nogle gode online opslagssteder, hvor man kan se beskrivelse
af C++ funktionerne?



Doe (04-08-2006)
Kommentar
Fra : Doe


Dato : 04-08-06 00:12

> Den fil jeg vil afspille har følgende data:
>
> TEST2.MP3
> ---------
> f f f a 9 0 4 4
> 1111 1111 | 1111 1010 | 1001 0000 | 0100 0100
> AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM
> A = 111 1111 1111
> B = 11 = MPEG Version 1 (ISO/IEC 11172-3)
> C = 01 = Layer III
> D = 0 = Protected by CRC (16bit crc follows header)
> E = 1001 = 128 kbit
> F = 00 = 44100 Hz (sampling rate)
> G = 0 = frame is not padded
> H = 0 = whatever (private bit)
> I = 01 = Joint stereo (Stereo)
> J = 00 = bands 4 to 31 (mode extension)
> K = 0 = Audio is not copyrighted
> L = 1 = Original media
> M = 00 = None emphasis
>
> .. så jeg skal lige have fundet alle stederne, hvor det skal ændres
> Sample raten var ikke nok at ændre, så der er jo nok nogle af de andre
> kald der skal ændres. Det kan selvfølgelig også være, at der skal
> ekstra/andre kald ind i.fb. med at der er "protected by CRC"?

Ahh, jeg fandt problemet. Det var antal kanaler. Det står åbenbart ikke i
headeren (men stereo er måske altid 2 kanaler?)?
Da jeg ændrede fra 1 til 2 kanaler, gik det fint.

Hvis jeg er lidt drastisk og vælger en 13MB MP3 fil, så går der cirka 4
sekunder før den begynder at spille. Er det fordi den loader det hele i
hukommelsen (flere gange)? Hvis jeg ser på mit memory forbrug før og efter,
så stiger min "committed memory" fra cirka 320MB til 1,1GB!? Det ser lidt
drastisk ud? Hvad laver den med alt det memory?



Bertel Brander (04-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 04-08-06 00:24

Doe wrote:
> Hvis jeg er lidt drastisk og vælger en 13MB MP3 fil, så går der cirka 4
> sekunder før den begynder at spille. Er det fordi den loader det hele i
> hukommelsen (flere gange)? Hvis jeg ser på mit memory forbrug før og efter,
> så stiger min "committed memory" fra cirka 320MB til 1,1GB!? Det ser lidt
> drastisk ud? Hvad laver den med alt det memory?

Jeg tror at den oversætter det hele til .wav (rå) format og
afspiller det.

Man kan godt få den til at afspille i små blokke af gangen ved
at kalde waveOutPrepareHeader og waveOutWrite for hver "blok".
Jeg vil tro at en blok er nBlockSize lang.
På den måde burde den være hurtigere til at komme i gang og bruge
mindre RAM.

"I" bittene fortæller om det er stereo eller mono.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste