x264里的2pass指的是什么意思? x264源代碼分析2.encode()

A:x264里的2pass指的是什么意思?另外stat是什么意思, 比如有個參數--stats <string> ?? ??? Filename for 2 pass stats [/"%s/"]/n", defaults->rc.psz_stat_out );
stats在這是什么意思?


2pass是2次編碼的意思,stats是統計文檔的名稱,記錄了1pass中的信息.2次編碼就相當于2次轉換這么做雖然轉換時間會漫長,但壓出的片子會有更好的畫質,畫面細節更好,而且體積會更小

2-pass主要是針對非實時的視頻編碼(如文件)來說的,通俗的說就是需要二次編碼,第一次編碼是先對整個文件進行掃描,記錄一些統計信息,第二次編碼時根據前面記錄的統計信息再進行編碼,這樣的好處是可以提高編碼的質量。

A:那個達人能簡單說說x264中 rc 部分 1pass 和 2pass的思路?

就此問題在 x264 開發郵件列表里問過。沒有得到一個明確的結論。
我看代碼的過程中,首先關注的是 1pass ,得到的一點經驗大概可以這樣描述:
首先 x264 中將 QP 通過一個確定的公式變換為 QScale 。其主要就是針對于 QS 作分析和控制/約束變化的
x264 的碼率控制接口是以幀為單位的,而支持的宏塊級變化只到宏塊行
編碼一個宏塊行之前調用接口函數以得到欲使用的 QP 。
它預測某個 gomb (宏塊組) 的耗費碼流的大小,利用在漏桶模型上,以之權衡 QP 是否需要改變并如何進行改變。
預測的時候是使用兩種預測求平均的方法,見 predict_row_size() 函數。
它的預測方程一個比較引起混淆的是它對歷史數據有個衰減的過程。
而且,這些衰減概念,應用在不同地方所用的幾個方程上。
它的 RC 核心函數是 rate_estimate_qscale() 。
其中一個 QS 的推導是一個需要解析的輸入表達式字符串,也因此在內部實現了一個表達式解析器,也許會產生一點晦澀感。
一時就想到這些。

E.????? 然后進入x264_encoder_encode( h, &nal, &i_nal, pic )函數,該函數定義在/Enc/encoder.c中.

開始進入比較復雜的地方了.

這個函數前面有一段注釋(如下):

****************************************************************************

* x264_encoder_encode:

* XXX: i_poc?? : is the poc of the current given picture

*?????? i_frame : is the number of the frame being coded

* ex: type frame poc

*?????? I????? 0?? 2*0//poc是實際的幀的位置.

*?????? P????? 1?? 2*3//frame是編碼的順序.

*?????? B????? 2?? 2*1

*?????? B????? 3?? 2*2

*?????? P????? 4?? 2*6

*?????? B????? 5?? 2*4

*?????? B????? 6?? 2*5

****************************************************************************/

要搞清poc和frame的區別.

假設一個視頻序列如下:

I B??? B??? P??? B???? B???? P

我們編碼是按I P B B P B B的順序,這就是frame的編號.

而我們視頻序列的播放序號是POC的序號,這里是乘以了2.

函數中先定義了如下三個參數:

int???? i_nal_type;

nal存放的數據類型, 可以是sps,pps等多種.??????????????????

int???? i_nal_ref_idc;

nal的優先級,nal重要性的標志位.

前面兩個參數雖然簡單,但如果不參照標準,也不容易理解,所以標準中的句法表是很重要的,可以說是最關鍵的.

int???? i_slice_type;

slice的類型,在x264中我的感覺好像一幀只有一個slice.如果確定了幀的類型,slice的類型也就確定了.

?

我們來看看編碼器是如何區分讀入的一幀是I幀,P幀,或者B幀,這個過程需要好好理解.

還以I?????? B B P B?? B???? P為例.

?

if( h->i_frame % (h->param.i_iframe * h->param.i_idrframe) == 0 ){

確定這是立即刷新片.

}

???????? 這里很好理解.

但到了if( h->param.i_bframe > 0 )//可以B幀編碼時.

就有問題了.

注意我們編完I幀后碰到了一個B幀,這時我們先不對它進編碼.而是采用frame = x264_encoder_frame_put_from_picture( h, h->frame_next, pic )函數將這個B幀放進h->frame_next中.

好,這里出現了h->frame_next,在h中同時定義了下面幾個幀數組用以實現幀的管理.

x264_frame_t?? *bframe_current[X264_BFRAME_MAX]; /* store the sequence of b frame being encoded */

??? x264_frame_t??? *frame_next[X264_BFRAME_MAX+1];?? /* store the next sequence of frames to be encoded *///搞清意義,下一個幀,而不一定是B幀.

??? x264_frame_t??? *frame_unused[X264_BFRAME_MAX+1]; /* store unused frames */

注意區分這3個數組.

同時還有下面4個函數(定義在/ENCODER/encoder.c中).

x264_encoder_frame_put_from_picture();

x264_encoder_frame_put();

x264_encoder_frame_get();

x264_frame_copy_picture();

這3個數組和4個函數可以說完成了整個幀的類型的判定問題.這個里面if ,else語句較多,容易使人迷惑.但我們只要把握下面一個觀點就可以看清實質:在不對P幀進行編碼之前,我們不對B幀進行編碼,只是把B幀放進緩沖區(就是前面提到的數組).

比如視頻序列:I???? B B P B B P

先確立第一個幀的類型,然后進行編碼.然后是2個B幀,我們把它放進緩沖區數組.然后是P幀,我們可以判定它的類型并進行編碼.同時,我們將緩沖區的B幀放進h->bframe_current[i],不過這時P幀前的兩個B幀并沒有編碼.當讀到P幀后面的第一個B幀時,我們實際上才將h->bframe_current數組中的第一個B幀編碼,也就是將在I幀后面的第一個B幀(說成P幀前面的第一個B幀容易誤解J)編碼.

依此類推,把握好上面4個函數的調用流程和指針操作的用法,就可以將幀的類型判定這個問題搞明白了.

F.????? 然后是速率控制(先不說這個,因為它對編碼的流程影響不大),看看建立參考幀列表的操作,也就是

x264_reference_build_list( h, h->fdec->i_poc ); (定義在/ENCODER/encoder.c中).

光看這個函數是不行的,它是和后面的這個函數(如下)一起配合工作的.

if( i_nal_ref_idc != NAL_PRIORITY_DISPOSABLE )//B幀時.

??? {

??????? x264_reference_update( h );

}

???? If條件是判斷當前幀是否是B幀,如果是的話就不更新參考列表,因為B幀本來就不能作為參考幀嘛!如果是I幀或P幀的話,我們就更新參考幀列表.

我們看到了一個for循環,兩個do—while循環.這是實現的關鍵,具體看代碼,不好用語言說明白.

G.???? 進入另一個復雜的領域:寫slice的操作,剛開使挺簡單,如我下面的注釋.

/* ---------------------- Write the bitstream -------------------------- */

??? /* Init bitstream context */

??? h->out.i_nal = 0;//out的聲明在bs.h中.

??? bs_init( &h->out.bs, h->out.p_bitstream, h->out.i_bitstream );//空出8位.

?

??? /* Write SPS and PPS */

??? if( i_nal_type == NAL_SLICE_IDR )//不是每次都要寫SPS and PPS,只有碰見立即刷新片時才寫.

??? {

??????? /* 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 );

}

不過看下面那個函數(就進入了復雜的領域).

H.???? x264_slice_write()(定義在/ENCODER/encoder.c中),這里面是編碼的最主要部分,下面仔細分析.

前面不說,看下面這個循環,它是采用for循環對一幀圖像的所有塊依次進行編碼.

for( mb_xy = 0, i_skip = 0; mb_xy < h->sps->i_mb_width * h->sps->i_mb_height; mb_xy++ )//h->sps->i_mb_width指的是從寬度上說有多少個宏快.對于寬度也就是288 / 16 = 18

??? {

??????? const int i_mb_y = mb_xy / h->sps->i_mb_width;

??????? const int i_mb_x = mb_xy % h->sps->i_mb_width;//這兩個變量是定義宏塊的位置.而不是指宏塊中元素的位置.

?

??????? /* load cache */

??????? x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把當前宏塊的up宏塊和left宏塊的intra4x4_pred_mode,non_zero_count加載進來,放到一個數組里面,這個數組用來直接得到當前宏塊的左側和上面宏塊的相關值.要想得到當前塊的預測值,要先知道上面,左面的預測值,它的目的是替代getneighbour函數.

/* analyse parameters

???????? * Slice I: choose I_4x4 or I_16x16 mode

???????? * Slice P: choose between using P mode or intra (4x4 or 16x16)

???????? * */

??????? TIMER_START( i_mtime_analyse );

??????? x264_macroblock_analyse( h );//定義在analyse.h中.

??????? TIMER_STOP( i_mtime_analyse );

?

??????? /* encode this macrobock -> be carefull it can change the mb type to P_SKIP if needed */

??????? TIMER_START( i_mtime_encode );

??????? x264_macroblock_encode( h );//定義在Enc/encoder.c中.

??????? TIMER_STOP( i_mtime_encode );

截止到這就已經完成編碼的主要過程了,后面就是熵編碼的過程了(我也沒看到那,但認為前面才是編碼的主要過程).下面對這個過程進行分析.

A.???? x264_macroblock_cache_load( h, i_mb_x, i_mb_y );它是將要編碼的宏塊的周圍的宏塊的值讀進來, 要想得到當前塊的預測值,要先知道上面,左面的預測值,它的作用相當于jm93中的getneighbour函數.

B.????? 進入x264_macroblock_analyse( h )函數(定義在/Enc/analyse.c中,這里涉及到了函數指針數組,需要好好復習,個人認為這也是x264代碼最為復雜的一個地方了).既然已經將該宏塊周圍的宏塊的值讀了出來,我們就可以對該宏塊進行分析了(其實主要就是通過計算sad值分析是否要將16*16的宏塊進行分割和采用哪種分割方式合適).

看似很復雜,但我們只要把握一個東西就有利于理解了:

舉個生活中的例子來說:

如果你有2元錢,你可以去買2袋1元錢的瓜子,也可以買一袋2元錢的瓜子,如果2袋1元錢的瓜子數量加起來比1袋2元錢的瓜子數量多,你肯定會買2袋1元的.反之你會去買那2元1袋的.

具體來說,對于一個16*16的塊,

如果它是I幀的塊,我們可以將它分割成16個4*4的塊,如果這16個塊的sad加起來小于按16*16的方式計算出來的sad值,我們就將這個16*16的塊分成16個4*4的塊進行編碼(在計算每個4*4的塊的最小sad值時已經知道它采用何種編碼方式最佳了),否則采用16*16的方式編碼(同樣我們也已知道對它采用哪種編碼方式最為合適了.

如果它是P幀或B幀的塊,同樣是循環套循環,但更為復雜了,可以看我在analyse.c中的注釋.

這里還要注意的是提到了

x264_predict_t????? predict_16x16[4+3];

typedef void (*x264_predict_t)( uint8_t *src, int i_stride );

這是函數指針數組,有很多對它的調用.

C.???? 退出x264_macroblock_analyse( h )函數,進入x264_macroblock_encode( )函數(定義在/ENCODER/macroblock.c中).

我拿宏塊類型為I_16*16為例.

if( h->mb.i_type == I_16x16 )

??? {

??????? const int i_mode = h->mb.i_intra16x16_pred_mode;

??????? /* do the right prediction */

??????? h->predict_16x16[i_mode]( h->mb.pic.p_fdec[0], h->mb.pic.i_fdec[0] );//這兩個參數的關系.

?????????????????????????????????????????????????????????????????? //涉及到x264_predict_t(函數指針數組),聲明在core/predict.h中,core/predict.c里有不同定義.

??????? /* encode the 16x16 macroblock */

??????? x264_mb_encode_i16x16( h, i_qscale );//

/* fix the pred mode value */

?????? …???? }

我們看到h->predict_16x16[i_mode]( h->mb.pic.p_fdec[0], h->mb.pic.i_fdec[0] );只調用了一次,這是因為在x264_macroblock_analyse( )中我們已經確定了采用4種方式中的哪種最合適.而在x264_macroblock_analyse( )中判定一個塊是否為I_16*16,我們調用了四次.這是因為當時我們需要拿最小的sad值進行比較.

繼續,是x264_mb_encode_i16x16( h, i_qscale )函數(定義在/ENCODER/macroblock.c中).在這個函數中我們就可以看到量化,zig-掃描等函數了,這些都是直來直去的,需要的只是我們的細心和對數學知識的掌握了

c)?????? 到這里還沒完,我們接著看

void x264_macroblock_encode( x264_t *h ){

…….前面省略.

執行到下面這條語句,看看下面是干啥的.

?

??? /* encode chroma */

??? i_qscale = i_chroma_qp_table[x264_clip3( i_qscale + h->pps->i_chroma_qp_index_offset, 0, 51 )];

??? if( IS_INTRA( h->mb.i_type ) )

??? {

??????? const int i_mode = h->mb.i_chroma_pred_mode;

??????? /* do the right prediction */

??????? h->predict_8x8[i_mode]( h->mb.pic.p_fdec[1], h->mb.pic.i_fdec[1] );

??????? h->predict_8x8[i_mode]( h->mb.pic.p_fdec[2], h->mb.pic.i_fdec[2] );

?

??????? /* fix the pred mode value */

??????? h->mb.i_chroma_pred_mode = x264_mb_pred_mode8x8_fix[i_mode];

??? }

?

??? /* encode the 8x8 blocks */

x264_mb_encode_8x8( h, !IS_INTRA( h->mb.i_type ), i_qscale );//對色度塊進行編碼了.

到這我們可以看到原來我們在這前面是對宏塊中的亮度系數進行了編碼,我們到上面那個函數才開始對色度系數進行編碼.進入x264_mb_encode_8x8()函數看到for循環里面有個2可以證明是對2個色度系數進行編碼,想法沒錯.

那下面這些又是干啥的呢?它們是計算cbp系數看需要對殘差(包括ac,dc)中的哪個系數進行傳輸的.

?

??? /* Calculate the Luma/Chroma patern and non_zero_count */

??? if( h->mb.i_type == I_16x16 )

??? {

??????? h->mb.i_cbp_luma = 0x00;

??????? for( i = 0; i < 16; i++ )

??????? {

??????????? const int nz = array_non_zero_count( h->dct.block[i].residual_ac, 15 );

??????????? h->mb.cache.non_zero_count[x264_scan8[i]] = nz;

??????????? if( nz > 0 )

??????????? {

??????????????? h->mb.i_cbp_luma = 0x0f;

??????????? }

??????? }

??? }

??? else

??? {

??????? h->mb.i_cbp_luma = 0x00;

??????? for( i = 0; i < 16; i++ )

??????? {

??????????? const int nz = array_non_zero_count( h->dct.block[i].luma4x4, 16 );//統計非0個數.

??????????? h->mb.cache.non_zero_count[x264_scan8[i]] = nz;

??????????? if( nz > 0 )

??????????? {

??????????????? h->mb.i_cbp_luma |= 1 << (i/4);// %16的意義.

??????????? }

??????? }

??? }

?

??? /* Calculate the chroma patern *///色度的cbp有3種方式.

??? h->mb.i_cbp_chroma = 0x00;

??? for( i = 0; i < 8; i++ )

??? {

??????? const int nz = array_non_zero_count( h->dct.block[16+i].residual_ac, 15 );

??????? h->mb.cache.non_zero_count[x264_scan8[16+i]] = nz;

??????? if( nz > 0 )??????????????????????

??????? {

??????????? h->mb.i_cbp_chroma = 0x02;??? /* dc+ac (we can't do only ac) */

??????? }

??? }

??? if( h->mb.i_cbp_chroma == 0x00 &&

??????? ( array_non_zero_count( h->dct.chroma_dc[0], 4 ) > 0 || array_non_zero_count( h->dct.chroma_dc[1], 4 ) ) > 0 )

??? {

??????? h->mb.i_cbp_chroma = 0x01;??? /* dc only */

??? }

?

??? if( h->param.b_cabac )

??? {

??????? if( h->mb.i_type == I_16x16 && array_non_zero_count( h->dct.luma16x16_dc, 16 ) > 0 )

??????????? i_cbp_dc = 0x01;

??????? else

??????????? i_cbp_dc = 0x00;

?

??????? if( array_non_zero_count( h->dct.chroma_dc[0], 4 ) > 0 )

??????????? i_cbp_dc |= 0x02;

??????? if( array_non_zero_count( h->dct.chroma_dc[1], 4 ) > 0 )

??????????? i_cbp_dc |= 0x04;

??? }

?

??? /* store cbp */

h->mb.cbp[h->mb.i_mb_xy] = (i_cbp_dc << 8) | (h->mb.i_cbp_chroma << 4) | h->mb.i_cbp_luma;

?

到這,基本上x264_macroblock_encode( h )(定義在Enc/encoder.c)基本上就分析完了.剩下的就是熵編碼的部分了.以后的部分更需要的應該是耐心和數學知識吧,相對前面來說應該簡單些.

?

l?????? 總結:

1. 我對代碼的理解應該還算比較深入,把代碼的主線已經分析了出來,對代碼中幾個最難理解的地方(最難理解的地方就是幀的類型的判定,參考幀是如何管理的,一個16*16的塊是采用到底需不需要分割,分割的話分成什么大小的,子塊又采用何種預測方式,這些實際上就是整個編碼的主線.)基本上已經明白,但有些過分復雜的函數的實現(或者涉及數學知識較多的地方)還有待深入研究,但我相信沿著這條主線應該能夠繼續深入下去,自己需要的是更多的時間和耐心. 自己需要的是更多的時間和耐心,爭取以后能寫出更詳細更準確的流程分析,并盡量思考能改進的地方.

2.層次性,就像網絡的7層結構一樣,每一幀圖像也可以分成很多層,只有對每層的語法結構(具體來說就是各個結構體中變量的意思)有了很好的理解,才有可能真正認清代碼,這需要對標準認真研習.比如說量化參數,就在3個地方有定義,不讀標準根本不會明白意思.

3. 很多過分復雜的東西不容易在本文中表達出來(比如說預測部分),只有通過自己的鉆研才能真正悟到,直覺也很重要,還有就是信心了.看這種程序的收獲就好像是真地肉眼看到了原子那樣.

4.由于代碼過分復雜,對某些函數的實現過程還沒能徹底理解,比如說x264_macroblock_cache_load()函數的具體實現過程,我只是知道它的功能,實現過程還有待認真理解.dct變換是如何實現的,是如何計算殘差的等等,這些都需要很多功夫,當然這里也需要大家的共同學習和交流.實現分工閱讀不同代碼部分并進行交流,才有可能對代碼做到徹底的理解.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455709.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目啟動居然如此重要!

項目的啟動階段比較短&#xff0c;項目經理往往容易忽視這個階段&#xff0c;但是&#xff0c;項目的啟動卻具有著重要的意義。 定基調&#xff1a; 基調包括工作的節奏、團隊氛圍和溝通風格等。 一首歌的第一句決定了這首歌的基調&#xff0c;如何唱好這第一句就是項目啟動所要…

mysql數據庫導入導出文件sql文件

window下 1.導出整個數據庫 mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名 mysqldump -u dbuser -p dbname > dbname.sql 2.導出一個表 mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名 mysqldump -u dbuser -p dbname users> dbname_users.sql 3.導出…

Android Studio主題設置、顏色背景配置

2019獨角獸企業重金招聘Python工程師標準>>> color-themes 效果展示 打開http://color-themes.com/有很多樣式可供選擇 1. Monokai Sublime Text 3(color theme) 2. Solarized Light (color theme) 3. Visual Studio 2015 Dark(color theme) 導入方式 下載主…

JavaScript中的函數

js函數 *第一種是使用function語句定義函數 function abc(){alert(abc); }*第二種是在表達式中定義函數 var 函數名 function\(參數1&#xff0c;參數2&#xff0c;…\){函數體};//例如&#xff1a;//定義var add function\(a,b\){return ab;}//調用函數document.write\(a…

x264源代碼分析1。fread()

相關說明:1. 使用版本: x264-cvs-2004-05-11 2. 這次的分析基本上已經將代碼中最難理解的部分做了闡釋,對代碼的主線也做了剖析,如果這個主線理解了,就容易設置幾個區間,進行分工閱讀,將各個區間擊破了. 3. 需要學習的知識:a) 編碼器的工作流程.b) H.264的碼流結構,像x264_sp…

在centos下安裝pycrypto報錯 RuntimeError: autoconf error

解決&#xff1a;yum -y install gcc File "/usr/lib64/python3.6/distutils/dist.py", line 974, in run_command cmd_obj.run() File "/usr/lib64/python3.6/distutils/command/build.py", line 135, in run self.run_command(cm…

Java多線程實現異步調用

在Java平臺,實現異步調用的角色有如下三個角色&#xff1a;調用者、 提貨單 、真實數據&#xff0c;一個調用者在調用耗時操作,不能立即返回數據時,先返回一個提貨單 .然后在過一斷時間后憑提貨單來獲取真正的數據.去蛋糕店買蛋糕&#xff0c;不需要等蛋糕做出來(假設現做要很長…

sql server 2008 r2卸載重裝_免費下載:Intouch軟件、Windows操作系統、SQL數據庫,VB6.0、C#...

為大家整理了常用的Windows操作系統和安裝軟件&#xff0c;基本上都是經過我們項目測試OK的版本&#xff0c;以后項目調試就齊全了&#xff0c;不用再“東奔西走”&#xff0c;“小鹿亂撞”了。整理不易&#xff0c;若對您有幫助請關注并轉發&#xff0c;以便幫助到更多的人。I…

Android ToolBar 使用完全解析

ToolBar簡介 ToolBar是Android 5.0推出的一個新的導航控件用于取代之前的ActionBar&#xff0c;由于其高度的可定制性、靈活性、具有Material Design風格等優點&#xff0c;越來越多的應用也用上了ToolBar&#xff0c;比如常用的知乎軟件其頂部導航欄正是使用ToolBar。官方考慮…

【零散積累】傳輸文件(sz/rz/scp命令)

來自wiki遷移頁面路徑&#xff1a;劉旺的主頁 / 個人零散積累 / 01> 傳輸文件&#xff08;sz/rz/scp命令&#xff09; 工作中的傳輸文件會出現在linux之間&#xff0c;或者linux與windows之間。 一、怎么實現linux與windows之間的文件傳輸&#xff1f; 1.sz和rz是什么 s…

x264_macroblock_cache_load()

功能:完成將已編碼數據參數和待編碼數據裝入到h->mb.cache中,下圖是BUF中存儲的數據在以MB為單位的時候的存儲順序 x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把當前宏塊的up宏塊和left宏塊的intra4x4_pred_mode&#xff0c;non_zero_count加載進來&#xff0c…

U(優)盤安裝FreeBSD-9.0+GNOME_lite桌面

貼圖在我的主頁&#xff1a;http://hi.baidu.com/daodej/item/26313f4fc3db51ef1f19bcc6 修訂于&#xff1a;2012/07/04 標題&#xff1a;U(優)盤安裝FreeBSD-9.0GNOME_lite桌面&#xff0c;boot0啟動XP(Windows)、FreeBSD、Ubuntu(Linux)三系統 【黑括號表示說明&#xff0c;中…

【零散積累】 vim常用操作

類型 操作 含義 刪除 dd 刪除游標所在的一整行(常用) ndd n為數字。刪除光標所在的向下n行&#xff0c;例如20dd則是刪除光標所在的向下20行 d1G 刪除光標所在到第一行的所有數據 dG 刪除光標所在到最后一行的所有數據 d$ 刪除光標所在處&#xff0c;到該…

生活中常見物聯網實例_物聯網網關常見問題解答(一)

1.為什么物聯網解決方案需要網關&#xff1f;物聯網網關彌合了設備&#xff0c;傳感器&#xff0c;設備&#xff0c;系統和云之間的通信鴻溝。通過系統地連接云&#xff0c;物聯網網關提供了本地處理和存儲&#xff0c;并具有基于傳感器輸入的數據自主控制現場設備的功能。物聯…

predict_16x16[i_mode]( p_dst, i_stride )lowres

h->predict_16x16[i_mode]( p_dst, i_stride ); 計算對應預測模式時的預測采樣值。輸出放到dst指向的數組中。Pred0ct_16x16是7個元素指向的數組&#xff0c;數組的每個元素是一個指向函數的指針變量&#xff0c;在x264_predict_16x16_init函數初始這個指針數組。7個元素分…

【零散積累】shell腳本學習

來自wiki遷移頁面路徑&#xff1a;劉旺的主頁 / 個人零散積累 / 03> shell腳本學習 case Shell case語句&#xff08;多分支條件判斷&#xff09; $( ) Linux—shell中$(( ))、$( )、與${ }的區別 - chengd - 博客園 在bash中&#xff0c;$( )與 &#xff08;反引號&…

mysql 表鎖-解鎖

遇到問題“”用工具navicat打開一張表的時候&#xff0c;有的時候會發現這張表怎么打不開&#xff0c;關了navicat工具&#xff0c;再打開&#xff0c;也是同樣的狀態。查看表鎖&#xff1a;show OPEN TABLES where In_use > 0;查看是否是表鎖住了。-- 查看進程號 show proc…

alsa 測試 linux_Electron 構建步驟 (Linux)

遵循下面的引導&#xff0c;在 Linux 上構建 Electron .PrerequisitesPython 2.7.x. 一些發行版如 CentOS 仍然使用 Python 2.6.x &#xff0c;所以或許需要 check 你的 Python 版本&#xff0c;使用 python -V.Node.js v0.12.x. 有很多方法來安裝 Node. 可以從 Node.js下載原文…

JavaScript中的數學對象Math

js數學對象Math //四舍五入 var res Math.round(5.921);//獲取最大值 var res Math.max(10,23,523,43,65,46,32,32);//獲取最小值 var res Math.min(12312,324,32,42,3,23,412,4332,21,3,-1);//獲取絕對值 var res Math.abs(-100);//退一取整 var res Math.floor(1.9);//…

centos7-安裝mysql5.6.36

本地安裝了mysql5.7, 但和springboot整合jpa時會出現 hibernateException, 不知道為什么, 換個mysql5.6版本的mysql, 源碼安裝, cmake一直過不去, 后來改成rpm安裝 1, 獲取mysql5.6 ftp://ftp.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.6/ 下載: 解壓: 其中…