1、1Surveillance SolutionsFFMPEGFFMPEG的使用的使用2022-6-3Scott.Zheng目目 录录一、编译一、编译二、解码二、解码三、编码三、编码四、去隔行四、去隔行五、缩放五、缩放六、六、RTSP接口接口2Surveillance solutions & services2022-6-3一、编译编译3Surveillance solutions & services2022-6-3 FFMPEG为开源项目,可以自由下载编译和使用。 后面关于FFMPEG的使用例程均以CentOS系统为平台,不同平台的编译有一定的差异,但使用接口保持一致。 下载: git clo
2、ne git:/source.ffmpeg.org/ffmpeg.git ffmpeg 下载完成后会在当前目录下生成一个ffmpeg子目录,里面即是ffmpeg项目的全部源码。 编译:进入ffmpeg子目录,运行./configure完成环境配置,再运行make,系统开始编译。如果需要安装到当前系统,编译完成后运行make install,相关的库将会被拷贝到/usr/lib目录下,头文件也会被拷贝到/usr/include目录下。./configure配置 FFMPEG包含了大量的编解码、MUX、DEMUX、PROTOCOL等模块,我们在实际应用中并不需要这么多的模块,这时候就需要修改FFM
3、PEG的默认配置了。输入./configure help,可以显示有那些选项可以修改。 最常用的是enable-shared,生成动态库; -disable-programs,不生成命令行程序,这在生成库时不需要; -disable-encoders、-disable-decoders,只做解码时可以把编码模块去掉,只做编码时可以把解码模块去掉。 根据自己的实际需要,删除不需要的模块,减小库的大小还可以使编译更容易通过。4Surveillance solutions & services2022-6-3二、编码二、编码 包含头文件(不同包含头文件(不同FFMPEG版本头文件有所差异)版本头文件
4、有所差异) #include avcodec/types.h #include “avcodec/avcodec.h” 定义变量定义变量 AVCodec*codec; AVCodecContext*c= NULL; AVFrame*picture; BYTEpbuf176*144*3/2,outbuf176*144*3/2; intret,ii;5Surveillance solutions & services2022-6-3 找到编码模块,申请资源,配置编码参数找到编码模块,申请资源,配置编码参数codec = avcodec_find_encoder( CODEC_ID_H263 );i
5、f( codec = NULL )return ;c = avcodec_alloc_context();picture = avcodec_alloc_frame();c-bit_rate= 100000;c-width= 176;c-height= 144;c-time_base.num= 1;c-time_base.den= 25;c-gop_size= 12; /c-max_b_frames= 1;c-pix_fmt= PIX_FMT_YUV420P;6Surveillance solutions & services2022-6-3 打开编码模块,开始编码打开编码模块,开始编码if(
6、 avcodec_open( c, codec ) picture-data0 = pbuf; picture-data1 = picture-data0 + 176*144; picture-data2 = picture-data1 + 176*144 / 4; picture-linesize0 = c-width; picture-linesize1 = c-width / 2; picture-linesize2 = c-width / 2; for( ii=0; iiret = avcodec_encode_video( c, outbuf, 176*144*3/2, pictur
7、e );7Surveillance solutions & services2022-6-3 释放编码资源释放编码资源 avcodec_close( c ); av_free( c ); av_free( picture );8Surveillance solutions & services2022-6-3三、解码三、解码9Surveillance solutions & services2022-6-3 包含头文件(不同包含头文件(不同FFMPEG版本头文件有所差异)版本头文件有所差异)#include avcodec/types.h#include “avcodec/avcodec.h”
8、 定义变量定义变量 AVCodec*codec; AVCodecContext*c= NULL; AVFrame*picture;AVPacketavpkt;BYTEpbuf176*144*3/2,outbuf176*144*3/2;intret,gotpiture; 找到解码模块、分配资源、打开解码模块找到解码模块、分配资源、打开解码模块codec = avcodec_find_decoder( CODEC_ID_H264 );av_init_packet( &avpkt );c = avcodec_alloc_context();picture = avcodec_alloc_frame(
9、);ret = avcodec_open( c, codec );avpkt.data = pbuf;avpkt.size = 10000;ret = avcodec_decode_video2( c, picture, &got_picture, &avpkt );if( got_picture )picture-data/ 解码输出缓冲区picture-linesize/ 输出缓冲区大小c-width/height;/ 图像宽度/高度10Surveillance solutions & services2022-6-311Surveillance solutions & services2
10、022-6-3 释放解码资源释放解码资源 avcodec_close( c ); av_free( c ); av_free( picture ); av_free_packet( &avpkt );四、去隔行四、去隔行AVPicturedstbuf;BYTEoutbuf176*144*3/2,dstbuf.data0 = outbuff;dstbuf.data1 = outbuff + 176*144;dstbuf.data2 = outbuff + 176*144 + 176*144/4;dstbuf.linesize0 = 176;dstbuf.linesize1 = 88;dstbuf
11、.linesize2 = 88;avpicture_deinterlace(&dstbuf,(AVPicture*)picture,PIX_FMT_YUV420P,176,144);12Surveillance solutions & services2022-6-3五、缩放五、缩放struct SwsContext*img_convert_ctx;intsws_flags;struct SwsContext*sws_opts;img_convert_ctx= NULL;sws_opts= NULL;AVPicturesrcbuf,dstbuf;BYTEoutbuf176*144*3,if(
12、img_convert_ctx = NULL )if( sws_opts = NULL )sws_flags = SWS_BICUBIC;sws_opts = sws_getContext( 176, 144, PIX_FMT_YUV420P, 176, 144, PIX_FMT_RGB32, sws_flags, NULL,NULL,NULL);sws_flags = (int)av_get_int( sws_opts, sws_flags, NULL );img_convert_ctx = sws_getCachedContext( img_convert_ctx, 176, 144, P
13、IX_FMT_YUV420P, 176, 144, PIX_FMT_RGB32, sws_flags, NULL, NULL, NULL);13Surveillance solutions & services2022-6-3srcbuf.data0 += (144-1)*srcbuf.linesize0;srcbuf.data1 += (72-1)*srcbuf.linesize1;srcbuf.data2 += (72-1)*srcbuf.linesize2;srcbuf.linesize0 = -srcbuf.linesize0;srcbuf.linesize1 = -srcbuf.li
14、nesize1;srcbuf.linesize2 = -srcbuf.linesize2;dstbuf.data0 = outbuff;dstbuf.linesize0 = 144*3;sws_scale( img_convert_ctx, srcbuf.data, srcbuf.linesize, 0, 144, dstbuf.data, dstbuf.linesize );if( img_convert_ctx )sws_freeContext( img_convert_ctx );if( sws_opts )av_free( sws_opts );14Surveillance solutions & services2022-6-3六、RTSP接口15Surveillance solutions & services2022-6-316Surveillance SolutionsThank you for your attention2022-6-3