【Android FFMPEG 开发】FFMPEG 方法中指针类型参数说明 ( 一维指针类型参数 | 二维指针类型参数 )
文章目錄
- I . 一維指針類型參數(shù)
- II . 二維指針類型參數(shù)
I . 一維指針類型參數(shù)
1 . 音視頻流數(shù)據(jù)包獲取 :
//讀取數(shù)據(jù)包AVPacket *avPacket = av_packet_alloc();av_read_frame(formatContext, avPacket);① 創(chuàng)建并初始化結(jié)構(gòu)體指針 : AVPacket *avPacket = av_packet_alloc() , 該結(jié)構(gòu)體是一個一維指針 ;
② 讀取數(shù)據(jù)包 : av_read_frame(formatContext, avPacket) , 讀取音視頻流中的數(shù)據(jù)包 , 并存放到 AVPacket *avPacket 指針指向的結(jié)構(gòu)體中 ;
2 . av_read_frame 函數(shù)原型 :
int av_read_frame(AVFormatContext *s, AVPacket *pkt);① 一維指針參數(shù) : av_read_frame ( ) 方法 , 接收的 AVPacket *pkt 是一個一維指針參數(shù) , AVPacket 是一個結(jié)構(gòu)體 , AVPacket * 是結(jié)構(gòu)體指針 , 該指針指向一個 AVPacket 結(jié)構(gòu)體 ;
② 一維指針參數(shù)可操作內(nèi)容分析 : 在 av_read_frame ( ) 方法內(nèi)部是不能修改 AVPacket *pkt 參數(shù)的結(jié)構(gòu)體指針的指向的 , 如果修改了 AVPacket *pkt 結(jié)構(gòu)體指針的指向 , 對外部的已經(jīng)初始化過的 AVPacket *avPacket = av_packet_alloc() 結(jié)構(gòu)體指針是不能造成影響的 , 這種操作無意義 ;
③ 傳入的一維指針要求 : 這種情況下傳入的指針必須經(jīng)過初始化才行 , 在方法中只修改指針指向結(jié)構(gòu)體的元素的值 ;
3 . 原理分析 ( 修改一維指針值 ) :
① 傳入副本 : 將 AVPacket *avPacket 作為參數(shù)傳入 av_read_frame ( ) 方法 , 僅僅是將指針的一個副本傳入了方法 ;
② 修改指針值無意義 : 對傳入的 AVPacket *pkt 指針參數(shù)的地址進行修改沒有意義 , 在方法中如果修改了傳入的指針的地址 , 僅僅是將傳入的副本的值改變了 , 之后的一系列修改都是針對一個副本的值進行的 ;
③ 不影響外部變量 : 函數(shù)作用于結(jié)束后 , 該副本的聲明周期也就結(jié)束了 , 與外部的 AVPacket *avPacket 沒有任何關(guān)系 ;
4 . 原理分析 ( 修改一維指針指向的結(jié)構(gòu)體的內(nèi)容 ) :
① 傳入副本 : 將 AVPacket *avPacket 作為參數(shù)傳入 av_read_frame ( ) 方法 , 傳入該指針副本作為參數(shù) ;
② 指向同一塊內(nèi)存 : 但是 AVPacket *avPacket 指針 , 與 AVPacket *pkt 副本參數(shù)指針 , 指向的內(nèi)存是同一塊內(nèi)存 ;
③ 影響外部變量 : 如果使用 AVPacket *pkt 參數(shù)的一維指針 ( 副本值 ) 修改該內(nèi)存中的值 , 那么該內(nèi)存中的值會被改變 , 此時外部指針 AVPacket *avPacket 指針指向的內(nèi)存的值也會被改變 ;
5 . 結(jié)論 :
① 一維指針參數(shù) : 傳入一維指針 , 只能修改指向的內(nèi)存的內(nèi)容 ; 修改一維指針本身指向無意義 ;
② 二維指針參數(shù) : 傳入 二維指針 , 只能修改一維指針 及 以下的內(nèi)容 ; 修改二維指針本身指向無意義 ;
③ N 維指針參數(shù) : 傳入 N 維指針 , 只能修改 N - 1 維指針 及 以下的內(nèi)容 , 修改 N 維指針內(nèi)容 無意義 ;
II . 二維指針類型參數(shù)
1 . 打開音視頻地址 :
AVFormatContext *formatContext = 0; int open_result = avformat_open_input(&formatContext, dataSource, 0, 0);① 未初始化的空指針 : AVFormatContext *formatContext 結(jié)構(gòu)體指針沒有進行初始化 , 是個空指針 ;
② 二維指針參數(shù) : avformat_open_input ( ) 方法傳入的是 AVFormatContext ** 二維指針參數(shù) , 目的是為了在方法中對 AVFormatContext * 進行初始化 , 初始化完成后 , 在傳遞到函數(shù)外部使用 ;
2 . avformat_open_input ( ) 函數(shù)原型 :
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);這里我們只關(guān)心 AVFormatContext **ps 二維指針參數(shù) ;
3 . 二維指針參數(shù) : 此處傳入二維指針參數(shù) , 二維指針的指向是副本改變沒有任何意義 , 該二維指針副本 AVFormatContext **ps 參數(shù)指向的是 AVFormatContext *formatContext 的一維指針變量地址 ( 二維指針 ) , 該二維指針地址不可修改 , 但是可以修改二維指針指向的一維指針的地址 , 即在方法中重新初始化一個 AVFormatContext *結(jié)構(gòu)體指針變量 , 用該二維指針指向它 ,
4 . 外部的一維指針 : AVFormatContext *formatContext 是外部的 AVFormatContext 結(jié)構(gòu)體指針 , 地址值為 A1 , 指向 AVFormatContext 結(jié)構(gòu)體 ;
5 . 外部的一維指針所在的內(nèi)存地址 : &formatContext 是二維指針地址值為 A2 , 指向 AVFormatContext *formatContext 一維指針的地址 A1 ( 存儲的是指向的結(jié)構(gòu)體地址 , 目前沒有初始化是空指針 ) ;
6 . 方法內(nèi)部修改二維指針指向的一維指針 : 在方法中需要創(chuàng)建并初始化 AVFormatContext 結(jié)構(gòu)體 , 地址是 A11 , 將該地址賦值給 A2 指向的內(nèi)存地址中 , 外部的 AVFormatContext *formatContext 一維指針地址就被修改成了 A11 ;
7 . 結(jié)論 : 傳入二維指針參數(shù) , 二維指針本身修改無意義 , 修改二維指針指向的一維指針 , 可以影響外部的一維指針 ;
總結(jié)
以上是生活随笔為你收集整理的【Android FFMPEG 开发】FFMPEG 方法中指针类型参数说明 ( 一维指针类型参数 | 二维指针类型参数 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android FFMPEG 开发】F
- 下一篇: 【C++】函数 指针类型参数 与 引用类