关于获取yuv帧数问题

读yuv文件的时候需要获取yuv文件的帧数,以便建立循环一帧一帧读取,这时候要获取yuv的帧数。

方法:首先用fopen函数打开一个yuv文件,接着用fseek(   fYUV,   0L,   SEEK_END   ),再接着用ftell来获取文件的大小size,由于用的是yuv420,因此用size/(WIDTH*HEIGHT*1.5)即获得了yuv文件的总帧数。

需要注意的是:fseek函数已把指向yuv文件的开始的指针改变了位置,即此时的指针已指向文件的结尾处,由于接着要进行文件的读写,这时候应该用rewind()函数把指针直接重新指到文件开始处。

 

ps:获得文件大小的几种方法

 

#include <iostream>
#include 
<io.h>
#include 
<sys/stat.h>
#include 
<afx.h>
#define _AFXDLL
using namespace  std;

void
 main()
{
    
// 此文件在工程打开状态下为不可访问

    char* filepath = "..//test.ncb" ;

    
// 方法一

    struct  _stat info;
    _stat(filepath, 
&
info);
    
int size =
 info.st_size;
    cout
<<size<<
endl;

    
// 方法二

    FILE* file = fopen(filepath, "rb" );
    
if
 (file)
    {
        
int size =
 filelength(fileno(file));
        cout
<<size<<
endl;
        fclose(file);
    }

    
// 方法三

    CFile cfile;
    
if
 (cfile.Open(filepath, CFile::modeRead))
    {
        
int size =
 cfile.GetLength();
        cout
<<size<<
endl;
    }

    
// 方法四

    HANDLE handle = CreateFile(filepath, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 00 );
    
if (handle !=
 INVALID_HANDLE_VALUE)
    {
        
int size =
 GetFileSize(handle, NULL);
        cout
<<size<<
endl;
        CloseHandle(handle);
    }
}

 

 

VS2005:若编译链接不通过,需要修改工程设置:

(1) Configuration Properties -> C/C++ -> Code Generation -> Runtime Library, 选择"Multi-threaded Debug(/MTd)"

(2) Configuration Properties -> Linker -> Input -> Ignore Specific Library, 输入"msvcprtd.lib"

 

例子中,由于在工程打开状态下,test.ncb文件无法打开,所以方法二、三无法获取文件大小,因此推荐使用方法一、四。

 

另:文件的随机读写

前面介绍了对文件的顺序读写操作,这些操作都是从文件的第一个有效数据(或某个位置)开始的,依照数据在文件存储设备中的先后次序进行读写,在读写过程中,文件位置指针自动移动。但在实际应用中,往往需要对文件中某个特定位置处的数据进行处理,换言之,就是读完一个字节的内容后,并不一定要读写其后续的字节数据,可能会强制性地将文件位置指针移动到用户所希望的特定位置,读取该位置上的数据,这就是随机读写文件。

C语言提供了对文件的随机读写功能。在随机方式下,系统并不按数据在文件中的物理顺序进行读写,而是可以读取文件任何有效位置上的数据,也可以将数据写入到任意有效的位置。

C语言通过提供文件定位函数来实现随机读写功能。

1. 获取文件位置指针当前值的函数ftell()

ftell()函数的功能是获得并返回文件位置指针的当前值。ftell()函数的原型定义为:

long ftell(FILE * fp);

其中参数fp是文件型指针,指向当前操作的文件。

rewind()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值