请教YUV播放器的开发? 各位大侠,小弟被上头要求开发一个YUV播放器,不知怎么入手?这个有原码可以下载么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 何谓YUV播放器?自己创建一个Overlay平面,将解压出的来的数据送显? 恩,是的,就是要播放YUV格式的视频数据。据说可以用DirectDraw来实现,可是不知道怎么入手:( 这东西不需要用到ddk的,完成可以把YUV变成RGB,加上BMP的头直接显示出来就可以了. 目前有YUVPlayer无源代码,也可参考YUVViewer的源代码 #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 represenationchar *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);} 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 represenationchar *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);} 【VC界面】如何设置整个程序的字体大小 有没有什么VC的插件能编译一次版本自动加1 如何根据程序的路径名获取该程序运行时的窗口标题? 关于VC2008 添加函数 请问如何让程序一启动就最小化到托盘里? 动态链接库的问题 如何删除CListCtrl控件的所有列? 如何改变static text控件的文本内容?(在线等待) 太奇怪了,我的程序为C/S模式,在测试的时候,甲连接乙可以,乙连接甲就不行,为什么? 求仙人指路:richedit与表格的问题? 坐标系的问题?急等ing... 请教一个关于Html视图的问题
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);
}
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);
}