青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

x264編碼得到的文件,在文件頭部的一些東西,有了新發現

轉載自:http://wmnmtm.blog.163.com/blog/static/38245714201192211245389/

下載的一個源碼里,實現了把264文件通過RTP發送,但是如果發送實時編碼的怎么辦,序列參數集和圖像參數集得自己發送,因為264文件本身在文件開頭已經存儲了這些了。

x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
(圖一)這是一個正確編碼得到的xxx.264文件,用UltraEDit打開的文件開始部分
 

在x264.dsw工程中,找了一下,找到點相關的東西。
另外,x264.exe在編碼文件時,只有一個地方進行文件的寫入,就是
int write_nalu_bsf( hnd_t handle, uint8_t *p_nalu, int i_size )
{
   if (fwrite(p_nalu, i_size, 1, (FILE *)handle) > 0)
{
         return i_size;
}
    return -1;
}
如果把函數里的代碼注釋掉,會發現,雖然在不停的編碼,但最終文件大小始終為0,從這一點可以證明只有此處進行文件的寫入操作。

那么,序列參數集是哪里來的呢,又找到一部分東西,在encoder.c文件的函數:
int     x264_encoder_encode( x264_t *h,/* 指定編碼器 */
                             x264_nal_t **pp_nal, /* x264_nal_t * */
 int *pi_nal, /* int */
                             x264_picture_t *pic_in,
                             x264_picture_t *pic_out )
中,有如下代碼:

    /* Write SPS and PPS 寫序列參數集、圖像參數集以及SEI版本信息,并不是寫入文件,而是寫入輸出緩沖區 最后通過p_write_nalu中的fwrite寫入到文件*/
    if( i_nal_type == NAL_SLICE_IDR && h->param.b_repeat_headers )
    {
printf("encoder.c : Write SPS and PPS");
system("pause");//暫停,任意鍵繼續

        if( h->fenc->i_frame == 0 )
        {
            /* identify ourself */
            x264_nal_start( h, NAL_SEI, NAL_PRIORITY_DISPOSABLE );
            x264_sei_version_write( h, &h->out.bs );
            x264_nal_end( h );
        }

        /* generate sequence parameters */
        x264_nal_start( h, NAL_SPS, NAL_PRIORITY_HIGHEST );
        x264_sps_write( &h->out.bs, h->sps );
        x264_nal_end( h );

        /* generate picture parameters */
        x264_nal_start( h, NAL_PPS, NAL_PRIORITY_HIGHEST );
        x264_pps_write( &h->out.bs, h->pps );
        x264_nal_end( h );
    }

    /* Write frame 寫入幀,并不是寫入文件,而是寫入輸出緩沖區*/
    i_frame_size = x264_slices_write( h );

在圖一中,看到有一個網址http://www.videolan.org,在源碼中搜索這個網址,找到唯一的一處,也就是如下的函數:
void x264_sei_version_write( x264_t *h, bs_t *s )
{
    int i;
    // random ID number generated according to ISO-11578
    const uint8_t uuid[16] = {
        0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7,
        0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef
    };
    char version[1200];
    int length;
    char *opts = x264_param2string( &h->param, 0 );

    sprintf( version, "x264 - core %d%s - H.264/MPEG-4 AVC codec - "
             "Copyleft 2005 - http://www.videolan.org/x264.html - options: %s",
             X264_BUILD, X264_VERSION, opts );
    x264_free( opts );
    length = strlen(version)+1+16;

    bs_write( s, 8, 0x5 ); // payload_type = user_data_unregistered
    // payload_size
    for( i = 0; i <= length-255; i += 255 )
        bs_write( s, 8, 255 );
    bs_write( s, 8, length-i );

    for( i = 0; i < 16; i++ )
        bs_write( s, 8, uuid[i] );
    for( i = 0; i < length-16; i++ )
        bs_write( s, 8, version[i] );

    bs_rbsp_trailing( s );
}

x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
 (圖二)注釋掉x264_sps_write( &h->out.bs, h->sps );的情況


x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
(圖三)注釋掉x264_pps_write( &h->out.bs, h->pps );的情況


x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲

(圖四)x264_sei_version_write( h, &h->out.bs );注釋掉,但是播放是一樣的

既然注釋掉仍能播,說明它不是必須的,僅是個版權聲明
 
 
猜想:
如果是實時的話,可以模仿下面的這兩句代碼發送序列參數集和圖像參數集:
x264_sps_write( &h->out.bs, h->sps );
x264_pps_write( &h->out.bs, h->pps );

實際就是要發送h->sps和h->pps

因為我編碼的文件是可以播放的,所以實際已經產生了sps和pps,直接發送就行了。

因為h是已知的,h = x264_encoder_open( &param );它的返回值就是x264_t,這樣就可以通過h->sps和h->pps,下面是我將它們單獨寫入文件的截圖:
x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
 sps_1
x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
 sps_2
x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
sps_3
 
上面是一個sps(sps1,sps_2,sps_3),看著內容好少啊。寫入代碼是:file1.Write(h->sps,sizeof(x264_sps_t));

x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲 
pps


PPS的內容也好少,可能是因為大多數均未指定,采用的是默認參數的原因吧,但是圖像寬度和高度在哪兒了。

h->x264_param_t    param;
這個也很關鍵,因為我指定的都是在這個里,
param.i_width=320;
param.i_height=240;
把這個也保一份看看。

x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
h->PARAM
param.i_width=320;
param.i_height=240;
這兩個數字對應的在哪呢,應該有才對啊,找找。(其實已經有了,只是現在沒找到,看后面)

后來換了個參數值,又試了一下
param.i_width=320;
param.i_height=240;
x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
這是i_width 為320和100的比較,一直折騰半天,發現0x64能對應上十進制100,但是320怎么也對不上。
后來又從結構體的存儲上找了半天(我直觀的認為結構體中的變量字段是按順序存在一塊連續空間的,對不對不知道了)

 x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
 
我分析,在unsigned int 和int共占8字節,那么第9、10、11、12個字節應該就是i_width,但還是對不上。直到ing提到小頭和大頭,也就是主機字節序和網絡字節序時,才驚醒過來。

原來,前面一直是對的,只是自己看成是錯的了,呵呵。

0x 64 00  ,實際應該看成 0x 00 64  ,換算成二進制表示: 0000 0000  0110 0100
0x 40 01  ,實際應該看成 0x 01 40  ,換算成二進制表示: 0000 0001  0100 0000

x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
 
x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
 
x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
 
x264編碼得到的文件,在文件頭部的一些東西,有了新發現 - 加菲 - 視頻會議 - 加菲
 


這下就對了。



小結一下:
1、結構體的各字段存儲在一段連續的內存中。
2、主機字節序,用二進制查看器查看到 0x 64 00 ,換算二進制時,要按 0x 00 64這樣反過來。(說法不標準,呵呵)
3、x264.exe編碼得到的文件,前面有一段版權聲明,是沒用的。
4、file1.Write(&(h->param),sizeof(x264_param_t));這樣把h->param寫入二進制文件是正確的。
5、只發送sps和pps可以嗎

posted on 2013-01-23 23:23 楊粼波 閱讀(2014) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲福利视频专区| 午夜久久电影网| 亚洲女与黑人做爰| 99国产精品| 亚洲永久字幕| 欧美中文字幕精品| 久久国产乱子精品免费女 | 欧美一区二区精品在线| 亚洲女爱视频在线| 久久高清国产| 欧美激情精品久久久| 亚洲三级毛片| 亚洲永久免费| 久久久爽爽爽美女图片| 免费成人毛片| 国产精品久久夜| 狠狠色综合播放一区二区| 91久久久亚洲精品| 午夜精品在线| 欧美国产免费| 亚洲字幕一区二区| 久久青青草综合| 欧美日韩三级| 好吊妞**欧美| 亚洲一区二区网站| 免费人成精品欧美精品| 在线视频精品一区| 噜噜噜91成人网| 国产精品腿扒开做爽爽爽挤奶网站| 国户精品久久久久久久久久久不卡 | 嫩草成人www欧美| 一区二区三区久久久| 久久久久se| 国产精品日日做人人爱| 亚洲人成在线播放| 久久精品1区| 一区二区三区av| 欧美承认网站| 欧美激情欧美狂野欧美精品 | 免费观看成人www动漫视频| 亚洲美女中文字幕| 老司机免费视频一区二区| 国产精品一区二区你懂的| aa级大片欧美三级| 亚洲电影在线播放| 久久精品国产亚洲一区二区三区| 国产精品久久久久影院亚瑟| 日韩小视频在线观看专区| 久久综合久色欧美综合狠狠 | 开心色5月久久精品| 国产日韩欧美一区| 亚洲综合视频网| 日韩视频精品在线观看| 欧美大胆人体视频| 亚洲激情网站| 亚洲国产精品久久久久秋霞不卡 | 久久综合给合久久狠狠色| 国产偷国产偷精品高清尤物| 亚洲一区视频在线观看视频| 99在线精品观看| 欧美日韩一区二区国产| 一区二区激情| 亚洲视频第一页| 国产精品永久免费观看| 午夜亚洲福利在线老司机| 亚洲午夜免费福利视频| 国产精品国产三级国产aⅴ浪潮| 亚洲午夜一区二区| 亚洲在线一区| 国产一区二区三区成人欧美日韩在线观看 | 伊甸园精品99久久久久久| 久久久999精品免费| 欧美在线你懂的| 亚洲国产精品一区二区第四页av| 免费观看亚洲视频大全| 麻豆精品视频| 一本久久综合亚洲鲁鲁五月天| 亚洲精品精选| 国产精品久久久久久久久动漫| 午夜宅男久久久| 久久久欧美一区二区| 日韩一级二级三级| 亚洲视频在线看| 精品999成人| 亚洲免费电影在线观看| 国产伦精品一区二区三区免费迷 | 亚洲欧美日韩国产成人精品影院| 国产九九精品视频| 久久综合伊人77777蜜臀| 乱中年女人伦av一区二区| 99热这里只有成人精品国产| 一区二区三区 在线观看视| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩小视频在线观看专区| 一区二区三欧美| 国语自产精品视频在线看8查询8| 亚洲高清二区| 国产精品推荐精品| 亚洲福利视频专区| 国产精品综合不卡av| 欧美高清在线一区二区| 国产精品国产精品国产专区不蜜| 免费成人黄色av| 国产精品国产成人国产三级| 欧美.www| 国产日韩欧美在线播放不卡| 亚洲欧洲精品一区二区三区不卡 | 亚洲欧美日本日韩| 亚洲精品国久久99热| 亚洲综合欧美| 亚洲精品欧洲| 久久久久天天天天| 欧美一级淫片aaaaaaa视频| 欧美精品免费在线| 农夫在线精品视频免费观看| 国产深夜精品| 中文av一区二区| 一区二区三区产品免费精品久久75| 久久不射2019中文字幕| 午夜在线观看免费一区| 欧美色精品天天在线观看视频| 欧美黄色片免费观看| 韩国av一区二区| 欧美一级夜夜爽| 欧美一区影院| 国产欧美精品一区| 亚洲一区图片| 欧美一区二区免费| 国产精品每日更新| 一本一本大道香蕉久在线精品| 日韩手机在线导航| 欧美高清影院| 亚洲精品看片| 99精品视频一区| 欧美激情在线免费观看| 亚洲国产91色在线| 亚洲精品一区二区在线观看| 欧美v国产在线一区二区三区| 欧美77777| 亚洲乱码日产精品bd| 欧美人妖另类| 欧美自拍偷拍| 久久婷婷综合激情| 国产精品一区二区在线观看网站| 91久久综合| 一级成人国产| 欧美新色视频| 亚洲影院在线| 久久成人亚洲| 国内激情久久| 蜜桃伊人久久| 亚洲精品国产精品国自产观看浪潮| 亚洲精选中文字幕| 欧美日韩精品一区视频| 中日韩美女免费视频网站在线观看| 午夜精品福利在线| 国产精品中文在线| 午夜久久影院| 欧美国产另类| 亚洲一区二区久久| 国产亚洲成av人在线观看导航 | 亚洲国产小视频| 欧美日韩综合视频| 午夜欧美理论片| 欧美激情精品久久久| 亚洲视频久久| 国产亚洲一级高清| 欧美福利在线观看| 亚洲综合电影| 亚洲激情欧美激情| 欧美在线精品一区| 亚洲人成在线观看一区二区| 欧美午夜免费电影| 久久人人看视频| 亚洲午夜精品一区二区| 欧美国产精品| 久久国产精品第一页| 亚洲伦理在线免费看| 国产一区导航| 欧美天堂亚洲电影院在线观看 | 亚洲网站在线看| 欧美电影在线观看完整版| 亚洲一区二区三区中文字幕| 亚洲二区精品| 国产农村妇女精品| 欧美日韩1区2区| 狂野欧美一区| 午夜免费电影一区在线观看| 亚洲精品中文字幕在线观看| 狂野欧美激情性xxxx欧美| 亚洲综合电影| 一本色道久久99精品综合| 伊大人香蕉综合8在线视| 国产精品亚洲精品| 欧美人成网站| 欧美国产第二页| 久久综合给合久久狠狠色| 久久激情网站| 欧美一区激情| 欧美亚洲免费|