ffmpeg基础知识
ffmpeg是音视频处理的c库, 音视频在网络传输过程中,由于数据量大,所有需要进行压缩
压缩目的为了去除冗余信息,冗余信息分为:
1、空间冗余:图像相邻像素之间有较强的相关性
2、时间冗余:视频序列的相邻图像之间内容相似
3、 编码冗余:不同像素值出现的概率不同
4、 视觉冗余:人的视觉系统对某些细节不敏感
5、知识冗余:规律性的结构可由先验知识和背景知识得到
● 无损压缩(Winzip)
压缩前解压缩后图像完全一致
压缩比低
● 有损压缩(H.264)
压缩前解压缩后图像不一致
压缩比高
利用人的视觉系统的特性(人眼能见的动画频率和图像细节有限制)
音视频压缩其实就是对音视频进行编码,
视频编码格式
音频编码格式
封装格式
流媒体协议
YUV ,是一种 颜色 编码 方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV是编译true-color颜色空间(colorspace)的种类,Y'UV,YUV, YCbCr , YPbPr 等专有名词都可以称为YUV,彼此有重叠。“Y”表示 明亮度 (Luminance、Luma),“U”和“V”则是**[色度]
YUV格式有两大类:(平面格式)planar和(打包格式)packed。
1.planar:先存储Y,然后U,然后V
2.packed:yuv交叉存储
还有我们常说的YUV420sp与YUV420p。
YUV420sp: 一种two-plane模式,即Y和UV分为两个平面,U、V交错排列。
YUV420p: 先把U存放完后,再存放V。UV是连续的。
YUV420的数据大小为: 亮度(行×列) + V(行×列/4) + U(行×列/4)即:W H 3/2,
普遍的编码器都以接受planar的I420数据(YUV420P)
4*4的I420数据排列如下:
y1 y2 y3 y4
y5 y6 y7 y8
y9 y10 y11 y12
y13 y14 y15 y16
u1 u2 u3 u4
v1 v2 v3 v4
Android相机的采集的视频是NV21(YUV420sP), 也是YUV的格式 只不过U和V的交叉的。
y1 y2 y3 y4
y5 y6 y7 y8
y9 y10 y11 y12
y13 y14 y15 y16
u1 v1 u2 v2
u3 v3 u4 v4
在采集相机数据时需要把UV数据给转换成上面的 顺序。
I frame :帧内编码帧 ,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。
P frame: 前向预测编码帧,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;
B frame: 双向预测内插编码帧 ,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;
I frame:自身可以通过视频解压算法解压成一张单独的完整的图片。
P frame:需要参考其前面的一个I frame 或者B frame来生成一张完整的图片。
B frame:则要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。
PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来
DTS:Decode Time Stamp。DTS主要是标识读入内存中的帧数据在什么时候开始送入解码器中进行解码。
在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。
DTS主要用于视频的解码,在解码阶段使用。PTS主要用于视频的同步和输出.在显示的时候使用。
如上图:I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.
libavformat
用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec
用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。
libavfilter
filter(FileIO、FPS、DrawText)音视频滤波器的开发,如水印、倍速播放等。
libavutil
包含一些公共的工具函数的使用库,包括算数运算 字符操作;
libswresample
原始音频格式转码。
libswscale
(原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换。
音视频解5封装流程:
ffmpeg解码流程:
绛旓細缂栫爜鍜屽崗璁弬鏁板彲閫氳繃鏂囨。娣卞叆瀛︿範銆ffmpeg鍙鐞嗘枃浠躲佺閬撱佺綉缁滄祦锛岄氳繃-mapping閫夋嫨鍐呭绫诲瀷锛屽瑙嗛銆侀煶棰戠瓑銆俧fplay鍙厤鍚坒fmpeg杩涜鎽勫儚澶撮噰闆嗗拰鏄剧ず锛屽畠灏嗗獟浣撴暟鎹繘琛岃В鐮佸拰鏄剧ず銆傚疄渚嬫紨绀轰簡ffmpeg鍦ㄦ祦濯掍綋搴旂敤涓殑閲囬泦銆佺紪鐮併佸彂閫佽繃绋嬶紝娑夊強鍒發ibavformat銆乴ibavcodec鍜宭ibavfilter绛夋牳蹇冨簱銆傚湪缂栫爜鏃讹紝...
绛旓細ffmpeg鏄煶瑙嗛澶勭悊鐨刢搴擄紝 闊宠棰戝湪缃戠粶浼犺緭杩囩▼涓紝鐢变簬鏁版嵁閲忓ぇ锛屾墍鏈夐渶瑕佽繘琛屽帇缂 鍘嬬缉鐩殑涓轰簡鍘婚櫎鍐椾綑淇℃伅锛屽啑浣欎俊鎭垎涓猴細 1銆佺┖闂村啑浣欙細鍥惧儚鐩搁偦鍍忕礌涔嬮棿鏈夎緝寮虹殑鐩稿叧鎬 2銆佹椂闂村啑浣欙細瑙嗛搴忓垪鐨勭浉閭诲浘鍍忎箣闂村唴瀹圭浉浼 3銆 缂栫爜鍐椾綑锛氫笉鍚屽儚绱犲煎嚭鐜扮殑姒傜巼涓嶅悓 4銆 瑙嗚...
绛旓細瑕佸洖绛旇繖涓棶棰橈紝鎴戜滑鍏堝紩鍏FFmpeg涓椂闂村熀鐨勬蹇碉紝涔熷氨鏄 time_base 锛屽畠鏄竴涓狝VRational缁撴瀯浣擄紝鍏跺畾涔夊涓嬶細time_base鏄敤鏉ュ害閲忔椂闂寸殑锛屾瘮濡倀ime_base = {1,25},瀹冪殑鎰忔濇槸灏1绉掑垎鎴25娈碉紝閭d箞姣忔灏辨槸1/25绉掞紝鍦‵Fmpeg涓嚱鏁癮v_q2d(time_base)灏辨槸鐢ㄦ潵璁$畻涓娈电殑鏃堕棿鐨勶紝璁$畻缁撴灉灏辨槸1/25...
绛旓細娣卞叆鎺㈢储闊宠棰戞妧鏈紝FFmpeg銆乄ebRTC鍜孯TMP绛夊伐鍏峰湪楂樼骇寮鍙戜腑鍙戞尌鍏抽敭浣滅敤銆傛妧鏈瘝姹囧oDB銆乑K銆佹祦濯掍綋銆丆DN銆丳2P銆並8S銆丏ocker銆乀CP/IP銆佸崗绋嬪拰DPDK绛夛紝閮芥槸寮鍙戣呬笉鍙垨缂虹殑宸ュ叿绠便傚涔犻煶瑙嗛鎶鏈紝涓嶄粎闇瑕佺悊璁鐭ヨ瘑锛岃繕瑕佸疄鎴樻紨缁冦傛帉鎻$‖瑙e拰杞В鐨勫尯鍒斺斿墠鑰呬緷璧朇PU鎴栦笓鐢ㄨВ鐮佽姱鐗囷紝閫熷害鏇村揩浣嗗吋...
绛旓細鍍忕礌鐐归樀琛ㄧず娉 涓寮犲浘鐗囧湪璁$畻鏈轰腑浼氬凡m琛寈n鍒楃殑褰㈠紡杩涜鎶芥牱锛屽湪纭畾姣忔牸鐨勯鑹诧紝鍦ㄤ繚瀛樺浘鍍忔暟鎹備笁鍘熻壊鍘熺悊锛氫换浣曢鑹插彲浠ラ氳繃绾佺豢銆佽摑涓夊熀鑹叉寜鐓т笉鍚岀殑姣斾緥鍚堟垚浜х敓 Y浠h〃鏄庝寒搴︼紝U涓嶸瀛樺偍鑹插害 ffmpeg -i input.mp4 -b:v 0.1M output_0.1M.mp4 淇敼瑙嗛鐮佺巼浼氬嚭鐜颁粈涔堢幇璞★紵涓轰粈涔堜細妯$硦銆...
绛旓細鏍稿績浠g爜绀轰緥涓紝compute鍑芥暟鏄绠梔B鍊肩殑鍏抽敭閮ㄥ垎锛屽畠鏍规嵁澹伴亾鍜岄噰鏍蜂綅鏁帮紝璁$畻pcmByteArray鐨勫钩鍧囩粷瀵瑰硷紝涓哄悗缁璬B鍊肩殑璁$畻鎻愪緵鍩虹銆傚湪Android涓巌OS鐨勫鐞嗛熷害涓婏紝FFmpeg灞曠幇鍑轰簡鏄庢樉鐨勪紭鍔裤傞氳繃璺ㄥ钩鍙扮殑瑙g爜锛孎Fmpeg鍙互楂樻晥鍦板鐞嗛煶棰戞祦锛屼緥濡傦紝瀵逛簬5鍒嗛挓鐨勬瓕鏇诧紝FFmpeg鍦ˋV_SAMPLE_FMT_S16P鏍煎紡涓嬶紝鍙...
绛旓細1 娴佸獟浣撶綉缁滈氳寮鍙 娴佸獟浣撶綉缁滈氳寮鍙戝矖浣 鍗70%锝 80%锛屽氨涓氾紝闆嗕腑鍦ㄨ姱鐗囷紝瀹夐槻锛屾暟瀛楃數瑙嗭紝骞垮憡锛岃杞﹁褰曚华锛岃溅杞界郴缁燂紝鏅鸿兘瀹跺眳锛屾ゼ瀹囧璁诧紝瑙嗛浼氳...澶ч儴鍒嗕粠涓氳呭悆楗潬杩欎釜棰嗗煙銆傞渶瑕佹帉鎻$殑鏄痷nix鎿嶄綔绯荤粺锛岀綉缁渟ocket閫氳, 闊宠棰鍩虹,264/265鍩虹锛岀紪瑙g爜,FFmpeg,甯歌鐨勭綉缁滈氳鍗忚TCP/UDP...
绛旓細浠讳綍鎯宠浠嶭inux涓婅璐垨浣跨敤娴佸獟浣撴妧鏈殑鐢ㄦ埛蹇呴』鍏峰涓瀹氱殑鎶鏈鐭ヨ瘑銆傚彲浠ヤ娇鐢↙inux鐨勫懡浠よ鐣岄潰鏉ラ儴缃茶棰戞祦銆傛瘮濡備笅闈㈢殑浠g爜锛岃浠g爜鏄剧ず濡備綍浠嶸LC涓娇鐢↙inux鐨ffmpeg锛歠fmpeg -i {input_file}.mkv -f mpegts -codec:v mpeg1video -s 640×480 -b:v 1000k -bf 0 -codec:a mp2 -ar ...
绛旓細閭i噷鏈変赴瀵岀殑FFmpeg銆乄ebRTC銆丷TMP绛夊濯掍綋寮鍙戣绋嬪拰璧勬枡鍖咃紝鍔╀綘娣卞叆鐞嗚В骞舵帉鎻GB鍦ㄥ疄闄呭紑鍙戜腑鐨勮繍鐢ㄣ傞氳繃浜嗚В杩欎簺鍩虹鐭ヨ瘑锛屼綘灏嗚兘鏇村ソ鍦伴┚椹壊褰╋紝鏃犺鏄负鍥惧儚澶勭悊銆佹父鎴忓紑鍙戯紝杩樻槸瑙嗛缂栬緫锛孯GB鏍煎紡閮藉皢鏄綘涓嶅彲鎴栫己鐨勫伐鍏枫傛帰绱GB鐨勪笘鐣岋紝璁╀綘鐨勫垱浣滄洿鍔犵敓鍔ㄥ褰┿
绛旓細(1) 鐔熸倝涓枃鍒嗚瘝鏍囨敞銆佹枃鏈垎绫汇佽瑷妯″瀷銆佸疄浣撹瘑鍒鐭ヨ瘑鍥捐氨鎶藉彇鍜屾帹鐞嗐侀棶绛旂郴缁熻璁°佹繁搴﹂棶绛旂瓑NLP 鐩稿叧绠楁硶;(2) 搴旂敤NLP銆佹満鍣ㄥ涔犵瓑鎶鏈В鍐虫捣閲廢GC鐨勬枃鏈浉鍏虫;(3) 鍒嗚瘝銆佽瘝鎬у垎鏋愩佸疄浣撹瘑鍒佹柊璇嶅彂鐜般佽涔夊叧鑱旂瓑NLP鍩虹鎬х爺绌朵笌寮鍙;(4) 浜哄伐鏅鸿兘,鍒嗗竷寮忓鐞咹adoop;(5) 鏁版嵁缁撴瀯鍜岀畻娉;搴旂敤棰嗗煙:...