Markus Rechberger / libmpeg3
 
StartSeite | MarkusRechberger/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Kleines codeschnipsel wie ich mp3s abspielen konnte (das programm hängt in der endlosschleife da's mir von anfang an nur drauf ankam wie ich richtig dekodierte musik nach /dev/dsp schreiben konnte)
 * problem: man bekommt 2 streams bei einem stereomp3, wenn man die streams nicht multiplext (was in dem fall sehr einfach ist) werden die samples zu schnell abgespielt und man bekommt chipmunksound
 * XFree Support ist drinnen da libmpeg3 auch mpegs abspielen kann, was ich später mittels xvideo kurz einmal antesten möchte -- xvideo ist in der version meines laptops drinnen 

#include <stdio.h>
#include <libmpeg3.h>
#include <sys/soundcard.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>


int main(int argc, char **argv){
        mpeg3_t *file;
        double time;
        short *buffer2;
        short *buffer3;
        short *buffer4;
        unsigned char output_rows[340][240];
        int streams,i,audio_fd;
        int depth;
        int r;
        int retval=0;
        FILE *dsp;
        XSetWindowAttributes attr;
        GC vo_gc;
        Display *mDisplay;
        Window vo_window;
        Window mRootWin;
        int screen;
        screen=DefaultScreen(mDisplay);
        XSetWindowAttributes window_attributes;
        unsigned long window_mask;

        mDisplay=XOpenDisplay((char*)0);
        window_attributes.border_pixel = BlackPixel (mDisplay, screen);
        window_attributes.background_pixel = BlackPixel (mDisplay, screen);
        window_attributes.override_redirect = 0;
        window_mask = CWBackPixel | CWBorderPixel;

        depth = DefaultDepth (mDisplay,DefaultScreen(mDisplay));
        vo_window=XCreateWindow(mDisplay,DefaultRootWindow(mDisplay), 0, 0, 320,240, 0, depth,
                        InputOutput, CopyFromParent,window_mask ,&window_attributes);
        vo_gc=XCreateGC(mDisplay,vo_window,0,0);
        XMapWindow(mDisplay,vo_window);
        XFlush(mDisplay);
//      vo_gc=XCreateGC(mDisplay, vo_window, 0L, &xgcv);
        audio_fd=open("/dev/dsp",O_WRONLY);
//        memset(buffer2,0x0,10240*sizeof(float));
        printf("\n------------------\n");
        file=mpeg3_open("test.mp3"); ///home/revenger/testing/kream204.mpg"); //test.mp3");
        r=16;
        ioctl(audio_fd,SNDCTL_DSP_SETFMT, &r);
        r=16;
        ioctl(audio_fd,SNDCTL_DSP_SETFMT, &r);
        printf("File has audio:  %s\n",mpeg3_has_audio(file)?"Yes":"No");
        printf("File has video:  %s\n",mpeg3_has_video(file)?"Yes":"No");
        streams=1; //1; //mpeg3_total_astreams(file);
        printf("Streams: %d\n",streams);
        streams=1;
        ioctl(audio_fd,SNDCTL_DSP_STEREO,&streams);
        printf("Sample rate: %d\n",mpeg3_sample_rate(file,streams-1));
        r=mpeg3_sample_rate(file,streams-1); //22050; //44100; //44100; //mpeg3_audio_samples(file,streams-1);
        buffer2=(short*)malloc(44100*2);
        buffer3=(short*)malloc(44100*2);
        buffer4=(short*)malloc(88200*2*2);
        retval=ioctl(audio_fd,SNDCTL_DSP_SPEED,&r);
        if(retval==-1){
                printf("couldn't set speed!\n");
        }
        printf("Length: %d\n",mpeg3_audio_samples(file,streams-1));
        while(1){
//              mpeg3_read_frame(file,output_rows,0,0,320,240,320,240,0,1);
                mpeg3_read_audio(file,NULL,buffer2,0,44100,streams-1);
                mpeg3_reread_audio(file,NULL,buffer3,1,44100,streams-1);
                printf("%ld",mpeg3_tell_byte(file));
                for(i=0;i<88200*2;i++){
                        if(i%2==0){
                                buffer4[i]=buffer2[i/2];
                        } else {
                                buffer4[i]=buffer3[i/2];
                        }
                }
                write(audio_fd,buffer4,88200*2);
                printf("file takes: %f seconds\n",mpeg3_get_time(file));
        }
        fclose(dsp);
        mpeg3_close(file);
        return(0);
}

viele CFLAGS wurden bereits von libmpeg3 vorgegeben Makefile
GCC=gcc
CFLAGS=-O3 -march=i686 -fmessage-length=0 -funroll-all-loops -fomit-frame-pointer -falign-loops=2 -falign-jumps=2 -falign-functions=2 -g
CLIBS=-lmpeg3 -L/usr/X11R6/lib/ -lX11

all:
        $(GCC) main.c -o main $(CFLAGS) $(CLIBS)


StartSeite | MarkusRechberger/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 11. Oktober 2004 1:49 (diff))
Suchbegriff: gesucht wird
im Titel
im Text