1. 程式人生 > >關於視訊H264編解碼的應用實現

關於視訊H264編解碼的應用實現

專案要用到視訊編解碼,最近半個月都在搞,說實話真是走了很多彎路,浪費了很多時間。將自己的最終成果記錄於此,期望會給其他人提供些許幫助。  

參考教程:

整體過程流程如下:

顯而易見,整個過程分為三個部分:採集、編碼、解碼。

1.        採集視訊

我是利用USB攝像頭採集視訊的,我的攝像頭只支援YUV422格式的影象採集,因為x264編碼庫只能編碼YUV420P(planar)格式,因此在採集到yuv422格式的影象資料後要變換成yuv420p格式。

採集視訊使用官方的那個採集程式,稍加修改即可,具體點說就是修改

static void  process_image (const char * p) ;函式

引數p指向一幀採集影象的yuv資料。

關於YUV格式和RGB格式,網上有很多教程。

在這兒,我講一下自己的理解。

假設有一幅4*4解析度的圖片,如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

每個畫素是由YUV資料構成,假設如下:

Y1

U1

V1

Y2

U2

V2

Y3

U3

V3

Y4

U4

V4

Y5

U5

V5

Y6

U6

V6

Y7

U7

V7

Y8

U8

V8

Y9

U9

V9

Y10

U10

V10

Y11

U11

V11

Y12

U12

V12

Y13

U13

V13

Y14

U14

V14

Y15

U15

V15

Y16

U16

V16

YUV422影象是這樣的,每個畫素採集Y,UV每隔兩個畫素採集一次:

Packed格式的YUV420是這樣的,每個畫素採集Y,UV隔行採集,每行是每兩個畫素採集一次:

以上幾種格式儲存就是按照從左到右,從上到下順序儲存的。

我想要得到是planar格式的YUV420,即在一段連續的記憶體中,先儲存所有的Y,接著是所有的U,最後是所有的V。

修改後的 process_image函式如下:

  1. static void  
  2. process_image                   (const char *           p)  
  3. {  
  4.         //fputc ('.', stdout);  
  5.     //convert yuv422 to yuv420p  
  6.             char *y=yuv420p;  
  7.             char *u=&yuv420p[IMAGE_WIDTH*IMAGE_HEIGHT];  
  8.             char *v=&yuv420p[IMAGE_WIDTH*IMAGE_HEIGHT+IMAGE_WIDTH*IMAGE_HEIGHT/4];  
  9.             int i=0,j=0,l=0;  
  10.             for(j=0;j<IMAGE_HEIGHT;j++)  
  11.                 for(i=0;i<IMAGE_WIDTH*2;i++,l++){  
  12.                     if(j%2==0){//even line to sample U-Chriminance  
  13.                         if(l==1){//sample U-Chriminance  
  14.                             *u=p[j*IMAGE_WIDTH*2+i];  
  15.                             u++;  
  16.                          }  
  17.                          else if(l==3){//abandon V-Chroma  
  18.                             l=-1;  
  19.                             continue;  
  20.                          }  
  21.                          else{  
  22.                             *y=p[j*IMAGE_WIDTH*2+i];  
  23.                             ++y;  
  24.                          }  
  25.                     }  
  26.                     else if(j%2==1){//odd lines to sample  V-Chroma  
  27.                         if(l==1){  
  28.                             continue;  
  29.                         }  
  30.                         else if(l==3){  
  31.                             l=-1;  
  32.                             *v=p[j*IMAGE_WIDTH*2+i];  
  33.                             ++v;  
  34.                         }  
  35.                         else {  
  36.                             *y=p[j*IMAGE_WIDTH*2+i];  
  37.                             ++y;  
  38.                         }  
  39.                     }  
  40.                 }  
  41.             fwrite(yuv420p,IMAGE_WIDTH*IMAGE_HEIGHT*3>>1,1,fp_yuv420p);  
  42.             fflush (stdout);  
  43. }  

2.編碼

採用x264編碼庫編碼yuv420p檔案。

程式如下:

  1. #include <stdint.h>  
  2. #include <x264.h>  
  3. #include <stdio.h>  
  4. #include <unistd.h>  
  5. #include <fcntl.h>  
  6. #include <stdlib.h>  
  7. #include <string.h>  
  8. #define DEBUG 0  
  9. #define CLEAR(x) (memset((&x),0,sizeof(x)))  
  10. #define IMAGE_WIDTH   320  
  11. #define IMAGE_HEIGHT  240  
  12. #define ENCODER_PRESET "veryfast"  
  13. #define ENCODER_TUNE   "zerolatency"  
  14. #define ENCODER_PROFILE  "baseline"  
  15. #define ENCODER_COLORSPACE X264_CSP_I420  
  16. typedef struct my_x264_encoder{  
  17.     x264_param_t  * x264_parameter;  
  18.     char parameter_preset[20];  
  19.     char parameter_tune[20];  
  20.     char parameter_profile[20];  
  21.     x264_t  * x264_encoder;  
  22.     x264_picture_t * yuv420p_picture;  
  23.     long colorspace;  
  24.     unsigned char *yuv;  
  25.     x264_nal_t * nal;  
  26. } my_x264_encoder;  
  27. char *read_filename="yuv420p.yuv";  
  28. char *write_filename="encode.h264";  
  29. int  
  30. main(int argc ,char **argv){  
  31.     int ret;  
  32.     int fd_read,fd_write;  
  33.     my_x264_encoder * encoder=(my_x264_encoder *)malloc(sizeof(my_x264_encoder));  
  34.     if(!encoder){  
  35.         printf("cannot malloc my_x264_encoder !\n");  
  36.         exit(EXIT_FAILURE);  
  37.     }  
  38.     CLEAR(*encoder);  
  39.     /**************************************************************************** 
  40.      * Advanced parameter handling functions 
  41.      ****************************************************************************/  
  42.     /* These functions expose the full power of x264's preset-tune-profile system for 
  43.      * easy adjustment of large numbers //free(encoder->yuv420p_picture);of internal parameters. 
  44.      * 
  45.      * In order to replicate x264CLI's option handling, these functions MUST be called 
  46.      * in the following order: 
  47.      * 1) x264_param_default_preset 
  48.      * 2) Custom user options (via param_parse or directly assigned variables) 
  49.      * 3) x264_param_apply_fastfirstpass 
  50.      * 4) x264_param_apply_profile 
  51.      * 
  52.      * Additionally, x264CLI does not apply step 3 if the preset chosen is "placebo" 
  53.      * or --slow-firstpass is set. */  
  54.     strcpy(encoder->parameter_preset,ENCODER_PRESET);  
  55.     strcpy(encoder->parameter_tune,ENCODER_TUNE);  
  56.     encoder->x264_parameter=(x264_param_t *)malloc(sizeof(x264_param_t));  
  57.     if(!encoder->x264_parameter){  
  58.         printf("malloc x264_parameter error!\n");  
  59.         exit(EXIT_FAILURE);  
  60. 相關推薦

    關於視訊H264解碼應用實現

    專案要用到視訊編解碼,最近半個月都在搞,說實話真是走了很多彎路,浪費了很多時間。將自己的最終成果記錄於此,期望會給其他人提供些許幫助。   參考教程: 整體過程流程如下: 顯而易見,整個過程分為三個部分:採集、

    H264 解碼協議詳解

    1.、什麼是 H264? H264 是 MPEG-4 標準所定義的最新編碼格式,同時也是技術含量最高、代表最新技術水平的視訊編碼格式之一,標準寫法應該是H.264 H264 視訊格式是經過有失真壓縮的,但在技術上儘可能做的降低儲存體積下獲得較好影象質量和低頻寬影象快速傳輸。

    netty使用msgpack自定義解碼實現序列化操作

    匯入依賴 <dependency> <groupId>org.msgpack</groupId> <artifactId>msgpack</artifactId>

    Android利用mediacodec進行視訊H264編碼解碼播放

    H264是目前最常用的視訊壓縮格式之一,可以將視訊、圖片、音訊等轉換為字串流形式,以此可以進行再次編輯、傳輸等。詳情參考http://blog.csdn.net/lcalqf/article/det

    WEBRTC 支援H264解碼

     WEBRTC視訊編解碼支援H264 VP8 VP9 但是預設是VP8 ,根據SDP描述協商 WEBRTC H264編碼採用OPENH264 解碼採用FFMPEG 一 讓WEBRTC支援H264編碼 1. 修改配置支援H264編碼  webrtc/build/commo

    讓WebRTC支援H264解碼

    https://blog.csdn.net/foruok/article/details/69525039 最近實驗了下如何讓WebRTC支援H264編碼,記錄下,供有需要的人蔘考。 說明一下,我是在 Ubuntu Server 14.04 下編譯的 WebRTC ,使用 native(C+

    android MediaCodec 音訊解碼實現

    從今天開始 每週不定期更新部落格,把這一週在工作與學習中遇到的問題做個總結。俗話說:好記性不如寫部落格,善於總結的人才能走的更遠。寫部落格這種利人利己的好處我就不一 一列舉了,總之,誰做誰知道,哈哈。在文章中如果有什麼問題或者錯誤,歡迎各位的討論和指正。好了,步入正題,來看看我們今天要講的MediaC

    [H264解碼引數] SEI

    SEI 補充增強資訊單元 : SEI 屬於 [RTP header] + 單一NAL單元模式 ,所以RTP包結構如下 0 1 2 3 0 1 2 3

    嵌入式Linux下基於FFmpeg的視訊硬體解碼

    摘要: 對FFmpeg多媒體解決方案中的視訊編解碼流程進行研究。結合對S3C6410處理器視訊硬體編解碼方法的分析,闡述了嵌入式Linux下基於FFmpeg的H.264視訊硬體編解碼在S3C6410處理器上的實現方法,為嵌入式多媒體開發提供參考。 引言 目前,智慧手機、PDA和平板電腦等越來越多的嵌入式裝

    android MediaCodec 音訊解碼實現——轉碼

    從今天開始 每週不定期更新部落格,把這一週在工作與學習中遇到的問題做個總結。俗話說:好記性不如寫部落格,善於總結的人才能走的更遠。寫部落格這種利人利己的好處我就不一 一列舉了,總之,誰做誰知道,哈哈。在文章中如果有什麼問題或者錯誤,歡迎各位的討論和指正。好了,步入正題,來

    [H264解碼引數] SPS

    #前言 RTP完整流程 已經 解釋了協議 所以要涉及具體的log分析 分為: SPS \ PPS\I幀\非I幀\FU-A SPS 序列引數集合 SPS 屬於 [RTP header] + 單一NAL單元模式 ,所以RTP包結構如下 0

    H264/AVC 視訊解碼一些基本知識

    本篇對學習H264常見的知識點做個備註。 1.H264編碼位元速率設定 對視訊進行編碼時,位元速率和視訊質量是一對矛盾的話題。一般位元速率越大,視訊丟棄冗餘資訊就越少,視訊質量就越高。但是位元速率達到一定程度,視訊質量人類無法識別,所以每種解析度都有一個閾值,編碼時按照閾值即可。一

    h264視訊解碼

    KevinLib開發類庫說明本類庫為快速發視訊系統必備參考之一,實現介面簡單,開放原始碼,可以無限制的重複使用 開發工具 VC++7.0 實現了視訊採集,音訊採集,壓縮解壓編碼:H264,MPEG4,WMV9,DIVX,XVID等 另外類庫裡有一些檔案操作類,介面十分簡單,十分鐘就可以建

    淺談視訊解碼器的工作原理和應用領域

    中國安防網小編要為大家講解三個方面的問題,一什麼是視訊編解碼器,二視訊編解碼器的工作原理,三視訊編解碼器的應用領域,且聽小編下面為大家分析。            什麼是視訊編解碼器          視訊編解碼器,是指一個能夠對數字視訊進行壓縮或者解壓縮的程式

    【H.264/AVC視訊解碼技術詳解】十五、H.264的變換編碼(二):H.264整數變換和量化的實現

    《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

    H264視訊傳輸、解碼----RTSP協議

    RTSP(Real Time Streaming Protocol), 實時流傳輸協議, 它是TCP/IP協議體系中的一個應用層協議 它是對流媒體進行控制 的網路控制協議,可以對流媒體提供諸如播放、暫停、快進、停止等操作,它負責定義具體的控制訊息、操作方法

    各種音視訊解碼學習詳解 h264 ,mpeg4 ,aac 等所有音視訊格式

    媒體業務是網路的主要業務之間。尤其移動網際網路業務的興起,在運營商和應用開發商中,媒體業務份量極重,其中媒體的編解碼服務涉及需求分析、應用開發、釋放license收費等等。最近因為專案的關係,需要理清媒體的codec,比較搞的是,在豆丁網上看運營商的規範 標準,同一運營商同樣的業務在不同文件中不同的要

    各種音視訊解碼學習——————詳解 h264 ,mpeg4 ,aac 等所有音視訊格式

    媒體業務是網路的主要業務之間。尤其移動網際網路業務的興起,在運營商和應用開發商中,媒體業務份量極重,其中媒體的編解碼服務涉及需求分析、應用開發、釋放license收費等等。最近因為專案的關係,需要理清媒體的codec,比較搞的是,在豆丁網上看運營商的規範 標準,同一運

    FFMPEG實現H264解碼(從源代碼角度)

    分配內存 cpp ide ram 變換 tools sign coder clip 農歷2014年底了,將前段時間工作中研究的FFMPEG解碼H264流程在此做一下整理,也算作年終技術總結了! H264解碼原理: H264的原理參考另一篇博文 http://blog.c

    音視頻解碼(一)——解碼:代碼實現

    工作目錄 studio 配置 ont format) OS std 標準 文件 前言:對於從未接觸過音視頻編解碼的同學來說,使用FFmpeg的學習曲線恐怕略顯陡峭。本人由於工作需要,正好需要在項目中使用。因此特地將開發過程總結下來。只當提供給有興趣的同學參考和學習。 由於F