FFMpeg中apiexample.c例子分析——解码分析
FFMpeg中apiexample.c例子分析——解碼分析 收藏
我們直接從 video_decode_example() 函數(shù)開始講,該函數(shù)實現(xiàn)了如何去解碼一個視頻文件,以 .mpeg 文 件為例。
( 1 )將緩存的末尾清 0 ,從而確保讀操作不會越界導(dǎo)致破壞 mpeg 流。
uint8_t inbuf[INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
memset(inbuf + INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
可見,我們所分配的緩存,除了存放數(shù)據(jù)外,最后部分還預(yù)留了一小段空間。
( 2 ) avcodec_find_decoder() 函數(shù)用于查找與 codec ID 相匹配的已注冊的解碼器。
( 3 ) avcodec_alloc_context() 函數(shù)用于分配一個 AVCodecContext 并設(shè)置默認值, 如果失敗返回 NULL ,并可用 av_free() 進行釋放。
( 4 ) avcodec_alloc_frame() 函數(shù)用于分配一個 AVFrame 并設(shè)置默認值,如果失敗返回 NULL , 并可用 av_free() 進行釋放。
( 5 ) avcodec_open() 函數(shù)用給定的 AVCodec 來初始化 AVCodecContext 。
對于一些編解碼器,像 msmpeg4 和 mpeg4 ,其寬度和高度必須要初始化,因為這些信息在碼流( bitstream )中是沒有的。 avcodec_open() 會幫我們把寬度和高度設(shè)置好。
( 6 )打開文件 fopen 。
( 7 )循環(huán)解碼。
來源:(http://blog.sina.com.cn/s/blog_4e87ac6e0100a60g.html ) - FFMpeg中apiexample.c例子分析——解碼分析_eNsEmpire_新浪博客
( 7.1 )讀取文件 fread(inbuf, 1, INBUF_SIZE, f );
注意 1 :一些編解碼器是基于流的(像 mpegvideo , mpegaudio ),這是使用它們的唯一一種方法,因為在解析它之前,你不知道壓縮數(shù)據(jù)的大小。
但是,一些其他編解碼器(像 msmpeg4 , mpeg4 )是基于幀的,所以對于某一幀,你必須調(diào)用這些編解碼器來處理所有數(shù)據(jù)。你也必須在初始化這些編解 碼器前,先把寬度和高度設(shè)置了。
注意 2 :一些編解碼器允許原始參數(shù)(像幀大小,采樣率)在任何一幀被改變。我們雖然已對此做了處理,但你也 要重視起來。
這兒,我們用一個基于流的解碼器( mpeg1video ),所以我們把數(shù)據(jù)輸?shù)浇獯a器,看它是否可以解碼一幀。
( 7.2 ) avcodec_decode_video() 函數(shù)用于解碼一個視頻幀 , 從 inbuf_ptr 到 picture, 所采用的編解碼器是 c 。
( 7.3 )寫入文件。
( 8 )解碼延時的幀,再寫入文件。
一些解碼器,像 MPEG ,傳輸 I 幀和 P 幀時,都會有一幀的延時。所以我們必須要獲取視頻的最后一幀數(shù)據(jù)。
( 9 )釋放資源。
fclose(f);
avcodec_close(c);
av_free(c);
av_free(picture);
總結(jié)
以上是生活随笔為你收集整理的FFMpeg中apiexample.c例子分析——解码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu安装完后设置root密码
- 下一篇: 第五届全国大学生GIS应用技能大赛开发题