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