中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

視頻采集、視頻壓縮

發布時間:2020-06-24 17:45:25 來源:網絡 閱讀:1330 作者:fanxiaojun 欄目:軟件技術

1.引言

      視頻的采集和壓縮是進行視頻傳輸、監控等視頻應用開發時必須采取的步驟。 
      關于視頻采集,本文探討了一種基于Windows平臺的簡單而實用的方法,利用微軟提供的VFW(Video For Windows)軟件包來實現,只需要有一般的USB攝像頭,就可以方便地對視頻進行采集和保存。 
   
視頻壓縮方面,本文探討了如何利用現階段壓縮率最大、傳輸可靠性最高的一種編碼標準—H.264標準的開源編碼器(T264)來實現對采集到的視頻文件進行壓縮的方法,利用VFW 所采集到的視頻格式是沒有進行任何壓縮的AVI 格式,首先對AVI 格式進行轉換,再利用T264源碼對轉換后的視頻流文件進行壓縮編碼,這樣就極大地壓縮了視頻文件,方便視頻的傳輸。

2.視頻信息的采集

    由于利用VFW軟件包能夠方便地實現視頻、音頻數據流到AVI文件的存儲,在Visual C++中將VFW軟件包的函數封裝成為AVICAP窗口類函數,利用AVICAP窗口類函數,程序員能夠通過發送消息或設置屬性來捕獲、播放和編輯視頻剪輯,能靈活地實現從模擬視頻源采集數字視頻信號,并將捕捉的視頻流存儲到磁盤或者直接對視頻緩存進行處理。
    
本文所述的方法是在Viusal C++ 6.0 軟件平臺上實現的,而軟件實現的具體步驟如下: 
    1)在采集視頻前必須先創建一個視頻采集的窗口,以及添加一些具體的操作按鈕,窗口利用函數capCreateCaptureWindow 來創建,如果窗口創建成功,返回窗口的句柄(程序中hwndV),如果創建不成功,則返回NULL 值。具體的創建程序及注釋如下: 
       hwndV=capCreateCaptureWindow(
      (LPSTR) "My Capture Window",   //捕捉窗口名稱
              
 WS_CHILD | WS_VISIBLE,       //窗口風格樣式 
                        150, 150, 300, 280,          //窗口位置和大小 
                        (HWND) hwndMain,             //父窗口句柄 
               
(int) 1);                    //窗口標識
       2)采集開始前,要將采集窗口與視頻設備相關聯,VFW接口采用capDriverConnect (hWndCap,,nIndex)這個函數,式中:hWndCap所建立的視頻捕捉窗口的句柄;nIndex為查詢得到的視頻卡驅動程序的索引號。接下來,獲取視頻采集設備的能力及狀態信息,VFW中采用函數capDriverGetCaps(hwnd,psCaps,wsize)來得到采集設備的能力,而采用capGetStatus (hwnd,s,size)函數來得到采集設備的狀態信息。
       3)啟動顯示模式并設置其模式參數,AVICAP  窗口類采用兩個函數來實現,具體程序和注釋如下:  
       capPreviewRate( hwndVideo, 66); //設置預覽播放速率 
        capreview( hwndVideo, TRUE);   //啟動預覽模式 

      4)采集視頻流并保存,并終止視頻采集并斷開與采集設備的連接,在程序的開頭定義一個結構體OPENFN,用于初始化一個對話框,而這個對話框是用來保存視頻的對話框。
  具體程序如下: 
 if (!isRecordFileOpen)

      OPENFN ofname;     //打開文件結構體
       ZeroMemory(&ofname, sizeof(OPENFN)); //初始化結構體 
      ofname.lStructSize = sizeof(OPENFN);    //結構體的大小 
      ofname.hwndOwner = hwndMain;            //主窗口句柄 
     ofname.lpstrFile = recordFile;         //保存的文件指針 
     ofname.nMaxFile = sizeof(recordFile);   //保存文件的大小 
      ofname.lpstrFilter = "Video\0*.avi";   //保存文件的后綴 
      ofname.nFilterIndex = 1;               //文件索引號 
      ofname.lpstrFileTitle = NULL;          //文件名指針 
      ofname.nMaxFileTitle = 0; 
    ofname.lpstrInitialDir = NULL; 
    ofname.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; 

     if(GetSaveFileName(&ofn) == TRUE)    //顯示保存文件的對話框
     {
       strcpy(recordFile, ofn.lpstrFile);
       strcat(recordFile, ".avi");
       isRecordFileOpen = true;
     }
 } 

        設置好保存文件以后,需用函數CreateThread來創建一個錄像的線程在其中采集視頻流,并利用函數capDriverDisconnect 來終止視頻采集并斷開與采集設備的連接,錄像線程的具體代碼如下:

       DWORD id;                          //創建一個錄像線程
          SECURITY_ATTRIBUTES ma;
       ma.nLength = sizeof(SECURITY_ATTRIBUTES);
       ma.lpSecurityDescriptor = NULL;
       ma.bInheritHandle = TRUE;
       hVideoThread = (&ma, (ULONG)0,
       videoThreadProc, (LPVOID)(ULONG)0, (ULONG)0, &id);

3.視頻格式的轉換

     本文所采用的是基于H.264編碼標準的視頻壓縮方法,所利用的源碼是由中國視頻編碼自由組織聯合開發的t264編×××,在使用本源碼前,編碼器要求進行壓縮的文件格式應為YUV 格式視頻文件,而VFW采集到的視頻文件是最原始的AVI 格式,因而要進行格式的轉換 。 
       從AVI格式到YUV 格式的轉換,并沒有直接的公式,而AVI視頻文件流的每一幀對應一個BMP(RGB)文件,則可以利用公式轉換成YUV 文件,轉換的公式如下:
     Y = 0.299R + 0.587G + 0.114B
     Cb = 0.564(B - Y )
     Cr = 0.713(R -Y )

      其中,Cb 對應U,Cr 對應V,分別表示構成彩色的兩個分量,而在程序中,則通過以下的程序來實現(按4:2:0 采樣格式):
      void RGB2YUV ( uint8 R, uint8 G, uint8 B, uint8 *y, uint8 *u, uint8 *v )
   {
     *y = Clip ( ( ( 66 * int(R) + 129 * int(G) + 25 * int(B) + 128) >> 8) + 16 );
     *u = Clip ( ( ( -38 * int(R) - 74 * int(G) + 112 * int(B) + 128) >> 8) + 128 );
     *v = Clip ( ( ( 112 * int(R) - 94 * int(G) - 18 * int(B) + 128) >> 8) + 128 );
   }

4.利用編碼器進行壓縮編碼

     由中國視頻編碼自由組織聯合開發的編碼器在基于VisualC++平臺上創建了一個console程序,而前述的視頻采集程序因為有窗口、按鈕等視圖窗口,故是一個windows程序,在Visual C++平臺中,要將console 程序和windows 程序很好地結合在一起使用,是個很復雜的過程,因此,可以在前面視頻采集程序里面運用一個C++函數ShellExecute 來調用編碼器函數。
    具體實現的步驟如下:

    1)首先針對采集后經格式轉換生成的YUV文件,得到它的幀數目,在配置文件enconfig.txt修改編碼幀的數目,例如如果幀數目為100,將enconfig.txt 文件中的第6、7、8 行: 
     300 # total frame number
    300 # i intervals
    300 # idr intervals 

     改為 :
    100 # total frame number 
    100 # i intervals
    100 # idr intervals

     幀數目修改以后,文件生成的路徑也應該改為最終exe 文件生成的路徑,在enconfig.txt的最后三行進行修改。
    1)編譯編碼器,是采用的CONSOLE 程序,一般是在命令行中來執行exe 程序,而本文中的方法是利用入口函數main(int argc, char* argv[])的特征,其中,argc 表示參數的個數,而argv[]數組用于保存參數的指針,在程序中就對參數進行賦值,省去了進入命令行進行執行的繁瑣過程,從而生成一個可以直接拿來運用的exe 程序。具體賦值語句如下:
     argv[0]="T264.exe";
   argv[1]="-e";
   argv[2]="enconfig.txt";

   2)設置t264.exe 文件路徑,上述的過程中已經生成一個可執行的t264.exe 文件,如果將YUV文件放在與之相同的目錄下,在調試運行這個程序的時候就可以生成264碼流文件,達到編碼的目的。但本文是需要將采集、壓縮編碼在同一個程序中完成,因而把生成的t264.exe文件復制到采集程序的調試目錄下面。
3)上述的工作都做好以后,可以在采集程序里面調用編碼器程序了,這時用一個函數來
實現,具體代碼是:  
           ShellExecute(NULL,"open","t264.exe",
       "T264.exe –e enconfig.txt",NULL,SW_SHOWNORMAL);

      其中,SW_SHOWNORMAL 指的是一種程序運行風格,此時代表正常運行,在調用時可以看到程序運行的全部過程(DOS命令窗口顯示),如果需要程序透明執行,不可見,則可以用SW_HIDE 來代替它。 
      至此,整個視頻采集、格式轉換與編碼壓縮的過程就全部完成了,本文中所采集的AVI文件大小為4.075M,經格式轉換后的YUV 文件大小為5.458M,而最終生成的264 碼流大小只有27k,壓縮率達到了150.9倍。

5.總結 

  
本文所探討的從視頻采集、格式轉換到壓縮編碼的整個過程,可以簡單方便地完成,可以直接應用在視頻監控或者視頻的網絡傳輸等的前期開發。佰銳科技已為視頻監控音視頻即時通訊提供了解決方案。http://www.bairuitech.com

對于本博客有任何問題的朋友可加Q:992139738

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太湖县| 忻州市| 天长市| 昌吉市| 汉中市| 桃江县| 张家川| 尖扎县| 咸宁市| 巨鹿县| 黎平县| 扎鲁特旗| 汉源县| 辉南县| 衡山县| 阿拉尔市| 南平市| 通江县| 历史| 额济纳旗| 凤阳县| 庄河市| 凉城县| 平度市| 民县| 石城县| 鲁甸县| 武威市| 佛坪县| 邵武市| 饶阳县| 道孚县| 张家界市| 南城县| 威宁| 绥江县| 凉城县| 吴旗县| 舒兰市| 荥阳市| 宜宾县|