各位大侠,小弟被上头要求开发一个YUV播放器,不知怎么入手?这个有原码可以下载么?

解决方案 »

  1.   

    何谓YUV播放器?自己创建一个Overlay平面,将解压出的来的数据送显?
      

  2.   

    恩,是的,就是要播放YUV格式的视频数据。据说可以用DirectDraw来实现,可是不知道怎么入手:(
      

  3.   

    这东西不需要用到ddk的,完成可以把YUV变成RGB,加上BMP的头直接显示出来就可以了.
      

  4.   

    目前有YUVPlayer无源代码,也可参考YUVViewer的源代码
      

  5.   

    #include <vfw.h>char *DWORD_to_fourCC(DWORD dw, char *fourcc);
    STDAPI AVIFileException(PAVISTREAM pavi, PAVIFILE pfile);int main(int argc, char *argv[])
    {
    // declaring variables
    PAVIFILE avi_file; // AVI file pointer
    PAVISTREAM avi_stream; // AVI stream pointer
    AVISTREAMINFO avi_sinfo; // AVI stream info structure; HRESULT hres; // windows result handle
    char fourcc[4]; // fourCC string // parse command line
    if (argc != 2) {
    fprintf(stderr, "Usage: avi_info avi_file\n");
    exit(1);
    }
    else {
    // initialize AVI file functions and open input
    AVIFileInit();
    if ( FAILED(hres=AVIFileOpen(&avi_file, argv[1], OF_READ, NULL)) ) {
    fprintf(stderr, "Can not open AVI file %s\n", argv[1]);
    exit(2);
    }
    // get AVI stream interface
    if ( FAILED(hres=AVIFileGetStream(avi_file, &avi_stream, 0, 0)) ) {
    AVIFileException(avi_stream, avi_file);
    fprintf(stderr, "Can not get AVI stream interface\n");
    exit(2);
    }
    } // get AVI stream information structure
    ZeroMemory(&avi_sinfo, sizeof(avi_sinfo));
    if ( FAILED(hres=AVIStreamInfo(avi_stream, &avi_sinfo, sizeof(avi_sinfo)))) {
    AVIFileException(avi_stream, avi_file);
    fprintf(stderr, "Can not get AVI stream information\n");
    exit(3);
    }

    // print out AVI stream information
    printf("\nAVI file name\t\t\t%s\n", argv[1]);
    printf("Stream Description\t\t%s\n", avi_sinfo.szName);
    printf("Frame size\t\t\t%ld x %ld\n",
    avi_sinfo.rcFrame.right - avi_sinfo.rcFrame.left,
    avi_sinfo.rcFrame.bottom - avi_sinfo.rcFrame.top);
    printf("Sequence fourCC code\t\t%s\n",
    DWORD_to_fourCC(avi_sinfo.fccHandler, fourcc));
    printf("Sequence fourCC Type\t\t%s\n", 
    DWORD_to_fourCC(avi_sinfo.fccType, fourcc));
    printf("Sequence play-back rate\t\t%.3f frames/sec\n",
    (double)avi_sinfo.dwRate / avi_sinfo.dwScale);
    printf("Editing has been done\t\t%ld times\n", avi_sinfo.dwEditCount);
    printf("Format has been changed\t\t%ld times\n",
    avi_sinfo.dwFormatChangeCount);
    printf("Sequence start frame\t\t%ld\n", avi_sinfo.dwStart);
    printf("Sequence Length\t\t\t%ld frames\n", avi_sinfo.dwLength);
    printf("Suggest buffer size\t\t%ld bytes\n",
    avi_sinfo.dwSuggestedBufferSize);
    printf("Sequence Quality\t\t%ld\n", avi_sinfo.dwQuality);
    printf("Sample size\t\t\t%ld\n\n", avi_sinfo.dwSampleSize);
    printf("dwFlags\t\t\t\t%ld\n", avi_sinfo.dwFlags);
    printf("dwCaps\t\t\t\t%ld\n", avi_sinfo.dwCaps);
    printf("wPriority\t\t\t%ld\n", avi_sinfo.wPriority);
    printf("wLanguage\t\t\t%ld\n", avi_sinfo.wLanguage); // clean up and exit
    AVIFileException(avi_stream, avi_file);
    return(0);}// this function converts DWORD to fourcc string represenation
    char *DWORD_to_fourCC(DWORD dw, char *fourcc)
    {
    fourcc[0] = (CHAR) ( dw );
    fourcc[1] = (CHAR) ( dw >> 8 );
    fourcc[2] = (CHAR) ( dw >> 16 );
    fourcc[3] = (CHAR) ( dw >> 24 ); return(fourcc);
    }STDAPI AVIFileException(PAVISTREAM pavi, PAVIFILE pfile)
    {
    AVIStreamRelease(pavi);
    AVIFileRelease(pfile);
    AVIFileExit();
    return(0);
    }
      

  6.   

    char *DWORD_to_fourCC(DWORD dw, char *fourcc);
    STDAPI AVIFileException(PAVISTREAM pavi, PAVIFILE pfile);int main(int argc, char *argv[])
    {
    // declaring variables
    PAVIFILE avi_file; // AVI file pointer
    PAVISTREAM avi_stream; // AVI stream pointer
    AVISTREAMINFO avi_sinfo; // AVI stream info structure; HRESULT hres; // windows result handle char fourcc[4]; // fourCC string
    char filename[80];
    char index[4]; int width, height; // frame width and height
    DWORD bsize; // buffer size
    long fsize, hfsize;
    long first, count, length;
    long nBytes, nSamples;
    register long i;
    register int j, k; unsigned char *frame; // frame buffer
    unsigned char *yuv; // output yuv buffer FILE *yuv_file, *raw_file; // parse command line
    if (argc < 3) {
    fprintf(stderr, "Usage: avi2yuv avi_file template first count\n");
    exit(1);
    }
    else {
    if (argc == 5) {
    if ( (first=atol(argv[3])) < 0 ||
    (count=atol(argv[4])) <= 0 ) {
    fprintf(stderr, "Invalid value for first and count\n");
    exit(2);
    }
    }
    else {
    first = 0;
    count = 0;
    }
    // initialize AVI file functions and open input
    AVIFileInit();
    if ( FAILED(hres=AVIFileOpen(&avi_file, argv[1], OF_READ, NULL)) ) {
    AVIFileExit();
    fprintf(stderr, "Can not open AVI file %s\n", argv[1]);
    exit(2);
    }
    // get AVI stream interface
    if ( FAILED(hres=AVIFileGetStream(avi_file, &avi_stream, 0, 0)) ) {
    AVIFileRelease(avi_file);
    AVIFileExit();
    fprintf(stderr, "Can not get AVI stream interface\n");
    exit(2);
    }
    } // get AVI stream information structure
    ZeroMemory(&avi_sinfo, sizeof(avi_sinfo));
    if ( FAILED(hres=AVIStreamInfo(avi_stream, &avi_sinfo, sizeof(avi_sinfo)))) {
    AVIFileException(avi_stream, avi_file);
    fprintf(stderr, "Can not get AVI stream information\n");
    exit(3);
    }

    // print out AVI stream information
    printf("\nAVI file name\t\t\t%s\n", argv[1]);
    printf("Stream Description\t\t%s\n", avi_sinfo.szName);
    printf("Frame size\t\t\t%ld x %ld\n",
    (width = avi_sinfo.rcFrame.right - avi_sinfo.rcFrame.left),
    (height = avi_sinfo.rcFrame.bottom - avi_sinfo.rcFrame.top) );
    printf("Sequence fourCC code\t\t%s\n",
    DWORD_to_fourCC(avi_sinfo.fccHandler, fourcc));
    printf("Sequence fourCC Type\t\t%s\n", 
    DWORD_to_fourCC(avi_sinfo.fccType, fourcc));
    printf("Sequence play-back rate\t\t%.3f frames/sec\n",
    (double)avi_sinfo.dwRate / avi_sinfo.dwScale);
    printf("Editing has been done\t\t%ld times\n", avi_sinfo.dwEditCount);
    printf("Format has been changed\t\t%ld times\n",
    avi_sinfo.dwFormatChangeCount);
    printf("Sequence start frame\t\t%ld\n", avi_sinfo.dwStart);
    printf("Sequence Length\t\t\t%ld frames\n", (length=avi_sinfo.dwLength));
    if (count==0)
    count = avi_sinfo.dwLength;
    printf("Suggest buffer size\t\t%ld bytes\n",
    (bsize = avi_sinfo.dwSuggestedBufferSize));
    printf("Sequence Quality\t\t%ld\n", avi_sinfo.dwQuality);
    printf("Sample size\t\t\t%ld\n\n", avi_sinfo.dwSampleSize);
    printf("dwFlags\t\t\t\t%ld\n", avi_sinfo.dwFlags);
    printf("dwCaps\t\t\t\t%ld\n", avi_sinfo.dwCaps);
    printf("wPriority\t\t\t%ld\n", avi_sinfo.wPriority);
    printf("wLanguage\t\t\t%ld\n", avi_sinfo.wLanguage); // allocate frame memory
    if ( !(frame=(unsigned char *)malloc(sizeof(unsigned char)*bsize)) ||
     !(yuv=(unsigned char *)malloc(sizeof(unsigned char)*bsize)) ){
    AVIFileException(avi_stream, avi_file);
    fprintf(stderr, "Can not allocate memory!\n");
    exit(3);
    } // read and write the frames
    if (first+count>length) {
    AVIFileException(avi_stream, avi_file);
    fprintf(stderr, "Not enough number of frames!\n");
    exit(2);
    }
    fsize = width * height;
    hfsize = fsize / 2;
    for (i=first;i<first+count;i++) { // read in the frame
    if ( FAILED(hres = AVIStreamRead(avi_stream, i, 1, frame, bsize,
    &nBytes, &nSamples)) ) {
    AVIFileException(avi_stream, avi_file);
    fprintf(stderr, "Stream read failure!\n");
    exit(5);
    } //creating output file name
    sprintf(index, "%03d", i);
    strcpy(filename, argv[2]);
    strcat(filename, index);
    strcat(filename, ".yuv");
    if ( (yuv_file = fopen(filename, "wb")) == NULL ) {
    AVIFileException(avi_stream, avi_file);
    fprintf(stderr, "Can not open %s for output!\n");
    exit(6);
    }
    sprintf(index, "%03d", i);
    strcpy(filename, argv[2]);
    strcat(filename, index);
    strcat(filename, ".raw");
    if ( (raw_file = fopen(filename, "wb")) == NULL ) {
    AVIFileException(avi_stream, avi_file);
    fprintf(stderr, "Can not open %s for output!\n");
    exit(6);
    } // based on the fourCC code, construct output yuv frame
    switch(avi_sinfo.fccHandler) { case(mmioFOURCC('U','Y','V','Y')):
    // UYVY format
    // byte ordering: u0 y0 v0 y1 | u2 y2 v2 y3...
    // copy all the Y components for raw Y output
    for (j=0;j<height;j++)
    for (k=1;k<width*2;k+=2)
    yuv[j*width+(k-1)/2] = frame[j*width*2+k];
    break; default:
    printf("Error\n");
    break;
    } // write out the YUV frame
    fwrite(frame, sizeof(unsigned char), fsize*2, yuv_file);
    fwrite(yuv, sizeof(unsigned char), fsize, raw_file);
    fclose(yuv_file);
    fclose(raw_file); } // clean up and exit
    free(yuv);
    free(frame);
    AVIFileException(avi_stream, avi_file);
    return(0);}// this function converts DWORD to fourcc string represenation
    char *DWORD_to_fourCC(DWORD dw, char *fourcc)
    {
    fourcc[0] = (CHAR) ( dw );
    fourcc[1] = (CHAR) ( dw >> 8 );
    fourcc[2] = (CHAR) ( dw >> 16 );
    fourcc[3] = (CHAR) ( dw >> 24 ); return(fourcc);
    }STDAPI AVIFileException(PAVISTREAM pavi, PAVIFILE pfile)
    {
    AVIStreamRelease(pavi);
    AVIFileRelease(pfile);
    AVIFileExit();
    return(0);
    }