vfw中的 AVIFileOpen()函数能打开非avi类型的视频文件吗?

时间:2021-09-30 20:09:15
因为我想用vfw对h264文件进行处理,已经安装了x264vfw解码器,boss告诉我转了这个解码器之后,就可以像处理avi一样处理h264视频,但是要处理视频,首先得能打开视频文件啊,我用AVIFileOpen()函数打不开264视频啊,我的代码如下:
         AVIFileInit();    
PAVIFILE   file;  
int   res   =   AVIFileOpen(&avi,   "D:\\test.264",   OF_READ,   NULL); 
if   (res   !=   0) 

 MessageBox( "error"); 
}
    if(file != NULL) 
        AVIFileRelease(avi); 
各位看看哪里出了问题

6 个解决方案

#1


AVIFileOpen只能打开AVI格式的文件。

#2


引用楼主 cppzz3 的回复:
因为我想用vfw对h264文件进行处理,已经安装了x264vfw解码器,boss告诉我转了这个解码器之后,就可以像处理avi一样处理h264视频,但是要处理视频,首先得能打开视频文件啊,我用AVIFileOpen()函数打不开264视频啊,我的代码如下:
         AVIFileInit();    
PAVIFILE   file;  
int   res   =   AVIFil……

===========================================
我想用vfw处理h264文件 有什么办法吗?

#3


1.确认文件格式是AVI格式。
2.用vfw处理的话确认安装了vfw h264 解码器。
3.vfw h264解码器支持AVI文件中的H264编码格式。

#4


引用 3 楼 dengzikun 的回复:
1.确认文件格式是AVI格式。
2.用vfw处理的话确认安装了vfw h264 解码器。
3.vfw h264解码器支持AVI文件中的H264编码格式。

我想用安装了x264vfw 想在程序中调用它将bmp转为视频,比如我可以用如下形式:
DWORD dwCodec = mmioFOURCC('X','V','I','D'), 现在但是h264的编码器用四个字符表示是什么啊?怎样枚举出编码器的名字,msdn中的vcm章节吗?我没看明白啊

#5


试试 'x''2''6''4'.
graphedit可以看到编码器名字。

#6


引用 5 楼 dengzikun 的回复:
试试 'x''2''6''4'.
graphedit可以看到编码器名字。

============================================
我用'x''2''6''4'后弹出了一个对话框 里面有如下信息,并且生成了一个只有几KB且不能播放的视频:
x264vfw [warning]: Few frames probably would be lost. Ways to fix this:
x264vfw [warning]:  - if you use VirtualDub or its fork than you can enable 'VirtualDub Hack' option
x264vfw [warning]:  - you can enable 'File' output mode
x264vfw [warning]:  - you can enable 'Zero Latency' option
我按照信息改了x264vfw的设置之后,生成的视频就是0KB了。

我有几个问题;1.既然出现了这个提示信息,是不是就是说明在程序中使用DWORD dwCodec = mmioFOURCC('x','2','6','4')的形式调用编码器是正确的? 

        2.如果调用方式不正确,我在MSDN中看到有枚举解码器的循环,可是参数我没搞懂,您帮我看看,如果我想在直接运行,这里面的参数应该是什么?
 for (i=0; ICInfo( fccType, i, & icinfo); i++) 

    hic = ICOpen(icinfo.fccType, icinfo.fccHandler, ICMODE_QUERY); 
    if (hic) 
    { 
        // Skip this compressor if it can't handle the format. 
        if (fccType == ICTYPE_VIDEO &&  pvIn != NULL && 
            ICDecompressQuery(hic, pvIn, NULL) != ICERR_OK) 
        { 
            ICClose(hic); 
            continue; 
        } 
 
        // Find out the compressor name. 
        ICGetInfo(hic, &icinfo, sizeof(icinfo)); 
 
        // Add it to the combo box. 
        n = ComboBox_AddString(hwndC,icinfo.szDescription); 
        ComboBox_SetItemData(hwndC, n, hic); 
    } 


#1


AVIFileOpen只能打开AVI格式的文件。

#2


引用楼主 cppzz3 的回复:
因为我想用vfw对h264文件进行处理,已经安装了x264vfw解码器,boss告诉我转了这个解码器之后,就可以像处理avi一样处理h264视频,但是要处理视频,首先得能打开视频文件啊,我用AVIFileOpen()函数打不开264视频啊,我的代码如下:
         AVIFileInit();    
PAVIFILE   file;  
int   res   =   AVIFil……

===========================================
我想用vfw处理h264文件 有什么办法吗?

#3


1.确认文件格式是AVI格式。
2.用vfw处理的话确认安装了vfw h264 解码器。
3.vfw h264解码器支持AVI文件中的H264编码格式。

#4


引用 3 楼 dengzikun 的回复:
1.确认文件格式是AVI格式。
2.用vfw处理的话确认安装了vfw h264 解码器。
3.vfw h264解码器支持AVI文件中的H264编码格式。

我想用安装了x264vfw 想在程序中调用它将bmp转为视频,比如我可以用如下形式:
DWORD dwCodec = mmioFOURCC('X','V','I','D'), 现在但是h264的编码器用四个字符表示是什么啊?怎样枚举出编码器的名字,msdn中的vcm章节吗?我没看明白啊

#5


试试 'x''2''6''4'.
graphedit可以看到编码器名字。

#6


引用 5 楼 dengzikun 的回复:
试试 'x''2''6''4'.
graphedit可以看到编码器名字。

============================================
我用'x''2''6''4'后弹出了一个对话框 里面有如下信息,并且生成了一个只有几KB且不能播放的视频:
x264vfw [warning]: Few frames probably would be lost. Ways to fix this:
x264vfw [warning]:  - if you use VirtualDub or its fork than you can enable 'VirtualDub Hack' option
x264vfw [warning]:  - you can enable 'File' output mode
x264vfw [warning]:  - you can enable 'Zero Latency' option
我按照信息改了x264vfw的设置之后,生成的视频就是0KB了。

我有几个问题;1.既然出现了这个提示信息,是不是就是说明在程序中使用DWORD dwCodec = mmioFOURCC('x','2','6','4')的形式调用编码器是正确的? 

        2.如果调用方式不正确,我在MSDN中看到有枚举解码器的循环,可是参数我没搞懂,您帮我看看,如果我想在直接运行,这里面的参数应该是什么?
 for (i=0; ICInfo( fccType, i, & icinfo); i++) 

    hic = ICOpen(icinfo.fccType, icinfo.fccHandler, ICMODE_QUERY); 
    if (hic) 
    { 
        // Skip this compressor if it can't handle the format. 
        if (fccType == ICTYPE_VIDEO &&  pvIn != NULL && 
            ICDecompressQuery(hic, pvIn, NULL) != ICERR_OK) 
        { 
            ICClose(hic); 
            continue; 
        } 
 
        // Find out the compressor name. 
        ICGetInfo(hic, &icinfo, sizeof(icinfo)); 
 
        // Add it to the combo box. 
        n = ComboBox_AddString(hwndC,icinfo.szDescription); 
        ComboBox_SetItemData(hwndC, n, hic); 
    }