Avatar billede stigc Nybegynder
29. september 2002 - 13:28 Der er 20 kommentarer og
1 løsning

Vorbis og vc++

Er der nogen der med succes har kompileret et projekt der bruger klasserne fra www.vorbis.com til at encode/decode en WAV/OGG fil?

I så fald ville jeg blive glad for en kopi...
Avatar billede mbulow Nybegynder
29. september 2002 - 20:26 #1
Nu har jeg ikke selv så meget styr på OggVorbis (læs: Fatter intet ;)

Meeen det har da lykkedes mig at kompilere et af eksemplerne der følger med OggVorbis-SDK'et. Har du selv prøvet med dem?

Det jeg fik kompileret var "encoder_example.c"...

For at kompilere det skulle jeg først tilføje nogle biblioteker, til kompilerens indstillinger, så den kunne finde de filer der blev inkludere, linket til:
includes:  C:\OggVorbis\include
libraries: C:\OggVorbis\lib

Bagefter skulle jeg huske at linke mod de relevante .lib-filer
Med grundet manglede dokumentation (eller manglende evne til at finde det relevante), foregik det mest af alt ved at prøve sig frem, og til sidst fandt jeg da også ud af at jeg skulle bruge følgende biblioteker:

ogg.lib
vorbis.lib
vorbisenc.lib



Hvis du ikke kan få det til at funke, eller jeg har forklaret noget for elendigt ;) Så spørg endelig... Men fortæl mig så lige hvilken compiler du bruger (også versionen)... Så ser vi om vi ikke kan finde ud af det :)
Avatar billede stigc Nybegynder
29. september 2002 - 20:40 #2
Det lyder godt..
Hvilken compiler har du brugt?
Avatar billede stigc Nybegynder
29. september 2002 - 20:44 #3
Jeg har prøvet med VC++ (v. 5.0 tror jeg nok)
Avatar billede stigc Nybegynder
29. september 2002 - 20:45 #4
Og ja, jeg har prøvet med de eksempler der i deres SDK.

Jeg får en række linker fejl. Problemet er nok at jeg ikke har brugt vc++ før og derfor ikke kan sætte projektet rigtigt op.
Avatar billede mbulow Nybegynder
29. september 2002 - 21:10 #5
Auv... Det er godt nok en nyere version jeg arbejder på, men mens jeg stadig studerede havde jeg da en af de der dejligt billige VC++5 studenterlicenser, så jeg tror da sagtens jeg kan finde ud af at hjælpe dig igennem det :)

Huske huske huske... Håber det lykkedes :)

For at indstille bibliotekerne, mener jeg du skal igennem menuen:
  Tools
og vælge det punkt der heller:
  Options...

Er der ikke et faneblad der der hedder: "Directories" ???

Så mener jeg der skal være en Combobox hvor du kan vælge forskellige typer filer... Bl.a. "Include" og "Libraries"

Først vælger du Include, og tilføjer stien til OggVorbis include-mappen.
I mit tilfælde "C:\OggVorbis\Include"

Bagefter gør du det samme med Libraries, hvor du tilføjer "C:\OggVorbis\lib"



Hvis det er lykkedes, så er det jo så langt så godt ;) hehe
Men husk at de biblioteker vist ikke sættes for et projekt, men kompileren... Så dit næste projekt skulle også kunne finde dem.



Nu skal du så ha tilføjet de relevante .lib-filer til projektet, og her er det jeg kommer ud på tynd is...

Jeg mener du i menuen Projekts, har et punkt nede i bunden der hedder "Settings"

Når du har valgt det skal du finde et sked hvor jeg mener der står "Linker options", eller noget i den retning...

Der tilføjer du navnene på de lib-filer jeg nævnte tidligere:
ogg.lib vorbis.lib vorbisenc.lib
Avatar billede mbulow Nybegynder
29. september 2002 - 21:19 #6
Hehe fandt lige den her:

http://wwwinfo.cern.ch/asd/lhc++/ObjectSpace/doc/ccs-2.1-install-guide.pdf

Godt nok til noget helt andet end OggVorbis, men det går nok.

Hvis du bladrer ned på side 12, hvor der er en overskrift med navnet: "Configuring your environment" og en underoverskrift "Microsoft Visual C++".

Følg de punkter der hedder:
- Include path
- Library path
- Linking component libraries

Der kan du se hvor du skal hen for at sætte de forskellige indstillinger... Selvfølgelig skal du skifte navnene ud med det der passer til OggVorbis :))
Avatar billede stigc Nybegynder
29. september 2002 - 21:39 #7
Fint, fint....

Jeg har allered sat Libary og include path, men mangler åbenbart at tilføje disse Libaries.  Jeg bruger foresten V 6.0 (det er min arbejdscomputer)
Avatar billede stigc Nybegynder
29. september 2002 - 21:46 #8
Ja, det var det jeg manglede. I projekt menu indskrev jeg:

ogg.lib og vorbis.lib

og nu kører det hele....
Avatar billede mbulow Nybegynder
29. september 2002 - 21:47 #9
Fint fint :) Takker for points
Avatar billede stigc Nybegynder
29. september 2002 - 22:43 #10
Du kan måske hjælpe mig med en ting mere. I koden bruger de stdin og stdout, men hvordan kalder jeg programmet så der hentes fra en fil og skrives til en anden? Kand et lade sig gøre med programmet som det ser ud nu? Jeg har prøvet at omskrive programmet med


myFile = fopen ("test.ogg", "rb")
myFile2 = fopen ("test.wav", "rb")

og så bruge dem i stedet for stdin og stdout men det giver fejl..


Her er lidt af eksempel koden:


int main(){
  OggVorbis_File vf;
  int eof=0;
  int current_section;

#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
  /* Beware the evil ifdef. We avoid these where we can, but this one we
    cannot. Don't add any more, you'll probably go to hell if you do. */
  _setmode( _fileno( stdin ), _O_BINARY );
  _setmode( _fileno( stdout ), _O_BINARY );
#endif

  if(ov_open(stdin, &vf, NULL, 0) < 0) {
      fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
      exit(1);
  }
Avatar billede mbulow Nybegynder
30. september 2002 - 00:26 #11
Yep yep :) Det kan du tro jeg kan, for jeg har selv fået det til at virke, og sidder og lytter til Ogg-filen mens jeg skriver det her indlæg ;) hehehe

Jeg har ændret eksempel-koden til at indlæse en .Wav-fil og encode den til en .Ogg-fil.

Det jeg har gjort er at oprette to fil-pointere i starten af main() sammen med alle de andre variable:
  FILE *pMyInput;
  FILE *pMyOutput;

Jeg har erstattet den der første:
  #ifdef _WIN32
      //En masse pladder
  #endif
med to linjer der åbner input og output fil
  pMyInput = fopen("C:\\Temporary\\MyInput.wav", "rb");
  pMyOutput = fopen("C:\\Temporary\\MyOutput.ogg", "wb");

Og som det sidste, lige inden return(0), sørger jeg for at lukke dem igen:
  fclose(pMyInput);
  fclose(pMyOutput);

Ud over det har jeg kigget hele filen igennem, og sørget for at udskifte stdin med pMyInput, og stdout med pMyOutput.



Jeg har fundet ud af at jeg med et funktionskald kunne have fået stdin, og stdout til at pege på input/output-filerne, men jeg synes ikke lige det var så pænt at ændre på stdin/stdout formål, men det er vel en smagssag :)
Avatar billede mbulow Nybegynder
30. september 2002 - 00:43 #12
YIKES... HOLDT STOP, LAD VÆRE
JEG MENTE IKKE DEN FØRSTE:
  #ifdef _WIN32
  #endif

Jeg opdagede lige at der også var sådan en blok allerede før main()-funktionen.

Den blok jeg hentydede til var den første:
  #ifdef _WIN32
  #endif
i main()-funktionen

Altså den som du også selv har skrevet i din sidste kommentar :)
Avatar billede stigc Nybegynder
30. september 2002 - 18:42 #13
Så fatter jeg ikke hvorfor mit eksemple går ned. Når jeg debugger går den ned i

if(ov_open(myFile, &vf, NULL, 0) < 0) {
      fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
      exit(1);
  }

og jeg har undersøgt at "myFile" peger på en fil. OGså en OGG fil...



Foresten skal du ikke selv lukke filen. Der skriver:

"Also, you should be aware that ov_open(), once successful, takes complete possession of the file resource. After you have opened a file using ov_open(), you MUST close it using ov_clear(), not fclose() or any other function. "
Avatar billede stigc Nybegynder
30. september 2002 - 19:24 #14
Nu prøvede jeg lige encoder eksemplet og det virker også fint hos mig. Har du prøvet nogen af andre eksempler? De går ned med hukommelses dfejl hos mig..
Avatar billede stigc Nybegynder
30. september 2002 - 19:27 #15
De skriver at filestrømmen skal være "seekable". Er den mon det når man bruger fopen "rb" ?
Avatar billede mbulow Nybegynder
01. oktober 2002 - 16:25 #16
Puha... Den var slem... Ja du må undskylde der lige gik et stykke tid før jeg skrev tilbage, men jeg har først lige fundet ud af hvad der var galt, og hvordan man løser problemet :) Men jeg tror endelig det lykkedes...

For det første kan du builde dit projekt som både "Debug" og "Release" hvilket du nok allerede har opdaget. Det betyder også bare at du skal bruge forskellige .lib-filer til de 2 måder at builde. (Forklaringen bygger på at projektet er sat til debug)
Som standard står et projekt til at builde som "Debug", og der fortalte jeg dig tidligere at du skulle bruge filerne:
  ogg.lib vorbis.lib osv...
Det er ikke helt rigtigt har jeg fundet ud af. Du skal faktisk bruge de tilsvarende filer der har et _d i slutningen af navnet. Altså:
  ogg_d.lib vorbis_d.lib osv...





Nu ved jeg ikke om det er helt nok, for jeg bruger VC++7 og der har MS ændret lidt i navnene på nogle DLL'er, så der ikke længere findes en fil med navnet MSVCRTD.DLL.

Hvis du, når du kører programmet, får en besked om at det ikke kan finde MSVCRTD.DLL, eller du vil løse problemet, så det ikke opstår i senere versioner af VC++, så kan du bare læse videre... Selvom det måske bliver lidt kryptisk :)





Det du gør, er at du endnu engang, ændrer i navnene på de .lib-filer du linker til. Denne her gang skal du tilføje et _static i midt i navnet, så de kommer til at hedde:
  ogg_static_d.lib vorbis_static_d.lib osv...
Dette har noget at gøre med at linke statisk, således at programmet ikke får brug for MSVCRTD.DLL-filen.

Hvis du prøver at kompilere nu, får du garanteret en ordentlig røvfuld fejl smidt i nakken bl.a. i form af en masse LNK2005-fejl.

Det du så gør nu, er at smutte forbi www.vorbis.com og downloade de filer der hedder:
  libogg source (1.0)
  libvorbis source (1.0)

Så udpakker du libvorbis-1.0.zip, og åbner det VC++6 Project Workspace der hedder vorbis.dsw. Det ligger i Win32-mappen.

Nu skal du så ind i "Project Settings" ligesom i et tidligere svar, men denne gang skal du have fat i det faneblad der hedder "C/C++".
Nu vælger du de projekter i venstre side der hedder noget med static (Ctrl + click, for at vælge flere på en gang)
Så sætter du "Category" til "Code Generation", og bagefter sætter du "Use run-time library" til "Debug Multithreaded"
Nu skal du så bare lige for en sikkerhedsskyld skifte mellem alle de valgte projekter, og sikre at de bruger den indstilling.

Så lukker du dialogen (Project settings), og laver en "rebuild all" (eller hvad den nu hedder).

Hvis du holder øje med hvad den laver, ser du sikkert en hel masse Warnings, men den skulle gerne kompilere og builde fint alligevel.

Nu skal du tilbage til Win32-mappen, og ind i Debug-mappen for hvert af de static-projekter du lige har buildet... Kopier nu .lib-filen til den lib-mappe som findes i OggVorbis-SDK'et som du hele tiden har brugt, og bare overskriv de eksisterende filer.

HELT DET SAMME GØR DU NU FOR Ogg-1.0.zip filen.

Til sidst skal du bare ind i dit eget projekt, og sørge for at det ligeledes er sat til "Debug Multithreaded".





Og så krydser jeg ellers alt hvad jeg kan krydse for at det lykkedes :)

Sørg lige for at have en kopi liggende af SDK'et (Du har vel stadig Zip-filen), for jeg er ikke helt 100% sikker på hvilke konsekvenser det her har for andre projekter, selvom jeg egentlig skulle mene at det burde gå godt.





PS!!! Når du en dag er færdig med det program du er ved at lave, vil du vel gerne lave en "Release" build, af dit projekt. Så skal du igennem helt den samme smørre en gang til, men altid sørge for at projekterne er sat til "Release", før du ændrer i nogle af indstillingerne. Denne gang skal du selvfølgelig vælge de tilsvarende indstillinger der IKKE hedder noget med Debug... F.eks. skal "Code generation" når du kører "Release", hedde "Multithreaded", i stedet for "Debug Multithreaded"
Avatar billede mbulow Nybegynder
01. oktober 2002 - 16:28 #17
ARGH!!! Der tabte jeg vist selv lige tråden et par gange da jeg læste det igennem, men jeg håber det går... Ellers skriver du bare tilbage :)
Avatar billede stigc Nybegynder
05. oktober 2002 - 21:35 #18
Det går ned i samme linine selv om jeg peger på "_d" libs. Den kompiler fint nok med 0 fejl.

Skal jeg virkelig kompilere sourcen om på min computer for at få det til at virke?
Avatar billede mbulow Nybegynder
05. oktober 2002 - 21:59 #19
Hmm... Godt spørgsmål... Men jeg må værre dig et svar skyldigt... Da jeg ikke engang kunne få programmet til at starte, da jeg prøvede med _d.lib-filerne (mangler den der dll-fil), har jeg ingen anelse om hvad der ville være sket bagefter.

Men prøv engang at rekompilere lib-filerne (og alt det andet pladder jeg har beskrevet), jeg tror ikke det tog mig meget mere end 10 minutter da jeg endelig fandt ud af hvad jeg skulle, så det er jo ikke så slemt.

PS!!! Ellers kan jeg lige se på mandag om jeg kan komme til en computer med VC++6, så kan jeg lige se hvor meget der skal til for at få det til at fungere :) (Og hvis det virker, kan jeg eventuelt sende projektet til dig, hvis du lige smidder en email)
Avatar billede stigc Nybegynder
05. oktober 2002 - 22:39 #20
det lyder sku' godt: stig@stigc.dk
Avatar billede mbulow Nybegynder
07. oktober 2002 - 14:47 #21
Hej igen :) Det lykkedes for mig at få det til at virke på en VC++6, selvom jeg ikke er helt sikker på hvad det er for en type fil, jeg har fået eksemplet til at decode en Ogg-fil til. Troede umiddelbart det var en WAV. Men nope... Snydt igen :)

Nå til sagen:
1) Indstil VC++6 så den kan finde OggVorbis SDK'ets Lib og Include filer
2) Opret et projekt i VC++6, med eksempelkoden
3) Link til: ogg_d.lib vorbis_d.lib vorbisfile_d.lib
4) Sæt "Use run-time library" til "Debug Multithreaded DLL"
5) Tilpas koden så den virker med filer i stedet for stdin/stdout
6) Build... Execute... :)

Jeg sender lige det her til dig i en mail, sammen med projektet.

Det jeg har gjort i projektet er at tilføje 4 linjer i starten hvor jeg åbner de to filer, og udkommenteret de par linjer hvor stdin/stdout bliver sat til binary-mode.
Derudover har jeg ændret stdin/stdout til pMyInput/pMyOutput gennem hele koden.
Til sidst lukker jeg lige pMyOutput-filen, men ikke pMyInput, da denne bliver lukket via ov_clean-funktionen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester