關於獲取yuv幀數問題

2021-05-24 11:42:00 字數 4233 閱讀 2729

讀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()

//方法三

cfile cfile;

if (cfile.open(filepath, cfile::moderead))

//方法四

handle handle 

=createfile(filepath, file_read_ea, file_share_read, 

0, open_existing, 0, 

0 );

if(handle 

!= invalid_handle_value)}

(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()

函式的返回值為檔案位置指標的當前位置。如果

rewind()

函式執行時出現錯誤,則返回長整型的

-1(即

-1l)。

2. 重置檔案位置指標的函式

rewind()

rewind()

函式的功能是使檔案的位置指標移到檔案的開頭處。

rewind()

函式的原型定義為:

void rewind(file * fp);

其中引數

fp是檔案型指標,指向當前操作的檔案。

rewind()

函式沒有返回值,其作用在於:如果要對檔案進行多次讀寫操作,可以在不關閉檔案的情況下,將檔案位置指標重新設定到檔案開頭,從而能夠重新讀寫此檔案。如果沒有

rewind()

函式,每次重新操作檔案之前,需要將該檔案關閉後再重新開啟,這種方式不僅效率低下,而且操作也不方便。使用

rewind()

函式便能克服這一缺陷。

【例

11.7

有乙個文字檔案

file1.dat

,兩次讀寫它的內容,第一次將它的內容顯示在螢幕上,第二次將它的內容複製到另乙個檔案

fiel2.dat

上。以下為實現該功能的程式**。

#include "stdio.h"

void main()

3. 移動檔案位置指標的函式

fseek()

函式fseek()

可以實現改變檔案位置指標到指定位置的操作。

fseek()

函式的原型定義為:

int fseek(file * fp,long offset,int origin);

即:int fseek(

檔案型別指標,位移量,起始點

);其中

fp為開啟的檔案指標,引數

offset

為檔案位置指標移動的位移量(單位為位元組),引數

origin

指示出檔案位置指標移動的起始點(或稱基點)位置。當執行

fseek()

函式後,檔案位置指標新的位置是以起始點為基準,向後(

offset

為正值)

/或向前(

offset

為負值)移動

offset

個位元組。檔案位置指標的新位置可以用公式「

origin+offset

」來計算得出。

二進位制檔案的基點

origin

可以取以下三個常量值之一:

⑴seek_set

(也可直接用數字

0表示):此時檔案位置指標從檔案的開始位置進行移動;

⑵seek_cup

(對應值為1)

: 此時檔案位置指標從檔案的當前位置進行移動;

⑶seek_end

(對應值為2)

: 此時檔案位置指標從檔案的結束位置進行移動。

文字檔案的基點

origin

只能取seek_set

常量值(或取

0值),而

origin

的值應為0。

fseek()

函式常用於二進位制檔案中,對於文字檔案則不常使用,因為文字檔案要進行字元的轉換,這會為檔案位置指標的計算帶來混亂。

fseek()

函式的呼叫形式為:

fseek()

函式返回乙個整形值。如果函式執行成功,返回

0值;否則,返回乙個非0值。

下面給出

fseek()

函式呼叫的兩個例子:

①fseek(fp,50l,1)

,將fp

指向的檔案的位置指標向後移動到離當前位置

50個位元組處;

②fseek(fp,-100l,2)

,將fp

指向的檔案的位置指標從檔案末尾處向前回退

100個位元組。

4. 應用例項

【例

11.8

在當前目錄下有一二進位制檔案

information.dat

,檔案中儲存有學生資訊資料。程式設計實現按指定位置讀取該檔案中的資料,顯示到螢幕上,並統計檔案的總位元組數目,也顯示到螢幕上。

以下為實現該功能的程式**。

#include "stdio.h"

struct student;/*

主函式*/

main()

;fp = fopen("information.dat","rb");

if(fp==null)

printf("record in file information.dat:/n");

for(i=1;i<5;i+=2)

getch();

}

Android 關於獲取攝像頭幀資料

第一部分 由於android下攝像頭預覽資料只能 imageformat.nv21 格式的,所以解碼時要經過一翻周折.camera mcamera camera.open camera.parameters p mcamera.getparameters p.setpreviewformat ima...

關於cookie獲取問題

後來發現由於我是在父頁面裡面開啟的table子標籤頁面document.cookie獲取的cookie裡面只包含path路徑為 的cookie值,然後在後台 需要加上setpath 設定cookie的path路徑為 問題解決 cookie取值注意問題,httponly打對號的為唯讀獲取不到,path...

關於recycleView高度獲取問題

1 computeverticalscrollextent 是當前螢幕顯示的區域高度 2 computeverticalscrolloffset 是當前螢幕之前滑過的距離 3 computeverticalscrollrange 是整個recycleview控制項的高度 4 recyclerview...