FFmpeg-视频编码-YUV编码出H264
编码出来的h264数据可以直接使⽤ffplay播放
int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);
函数的作⽤是通过指定像素格式、图像宽、图像⾼来计算所需的内存⼤⼩
重点说明⼀个参数 align :此参数是设定内存对⻬的对⻬数,也就是按多⼤的字节进⾏内存对⻬:
av_image_alloc()是这样定义的。此函数的功能是按照指定的宽、⾼、像素格式来 分配图像内存 。
int av_image_alloc(uint8_t *pointers[4], int linesizes[4], int w, int h, enum AVPixelFormat pix_fmt, int align);
int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], const uint8_t *src, enum AVPixelFormat pix_fmt, int width, int height, int align);
av_image_fill_arrays()函数 ⾃身不具备内存申请的功能 ,此函数类似于格式化已经申请的内存,即通过 av_malloc()函数申请的内存空间,或者av_frame_get_buffer()函数申请的内存空间。
av_image_fill_arrays()中 参数具体说明 :
视频码率是视频数据(包含视频⾊彩量、亮度量、像素量)每秒输出的位数。⼀般⽤的单位是kbps。
在视频会议应用中,视频质量和网络带宽占用是矛盾的,通常情况下视频流占用的带宽越高则视频质量也越高;如要求高质量的视频效果,那么需要的网络带宽也越大;解决这一矛盾的钥匙当然是视频编解码技术。评判一种视频编解码技术的优劣,是比较在相同的带宽条件下,哪个视频质量更好;在相同的视频质量条件下,哪个占用的网络带宽更少。
是不是视频码率越高,质量越好呢?理论上是这样的,然而在我们肉眼分辨的范围内,当码率高到一定程度,感觉没有什么差别。所以码率设置有它的最优值,H.264(也叫AVC或X.264)的文档中,视频的建议码率如下:
鉴于x264的参数众多,各种参数的配合复杂,为了使⽤者⽅便,x264建议如⽆特别需要可使 ⽤preset和tune设置。这套开发者推荐的参数较为合理,可在此基础上在调整⼀些具体参数以符合⾃⼰需要,⼿动设定的参数会覆盖preset和tune⾥的参数。
使⽤ ffmpeg -h encoder=libx264 命令查询相关⽀持的参数
x264是⼀个 H.264/MPEG4 AVC 编码器,本指南将指导新⼿如何创建⾼质量的H.264视频。 对于普通⽤户通常有两种码率控制模式:CRF(Constant Rate Factor)和Two pass ABR。码率控制是⼀种决定为每⼀个视频帧分配多少⽐特数的⽅法,它将决定⽂件的⼤⼩和质量的分配。
如果你在编译和安装libx264 ⽅⾯需要帮助,请查看ffmpeg和x264编译指南: http://ffmpeg.org/trac/ffmpeg/wiki/CompilationGuide
量化⽐例的范围为0~51,其中0为⽆损模式, 23 为缺省值,51可能是最差的。该数字越⼩,图像质量越 好。从主观上讲,18~28是⼀个合理的范围。18往往被认为从视觉上看是⽆损的,它的输出视频质量和输 ⼊视频⼀模⼀样或者说相差⽆⼏。但从技术的⻆度来讲,它依然是有损压缩。
若CRF值加6,输出码率⼤概减少⼀半;若CRF值减6,输出码率翻倍。通常是在保证可接受视频质量的前提下选择⼀个最⼤的CRF值,如果输出视频质量很好,那就尝试⼀个更⼤的值,如果看起来很糟,那就尝 试⼀个⼩⼀点值。
预设是⼀系列参数的集合,这个集合能够在编码速度和压缩率之间做出⼀个权衡。⼀个编码速度稍慢的预 设会提供更⾼的压缩效率(压缩效率是以⽂件⼤⼩来衡量的)。这就是说,假如你想得到⼀个指定⼤⼩的⽂ 件或者采⽤恒定⽐特率编码模式,你可以采⽤⼀个较慢的预设来获得更好的质量。同样的,对于恒定质量编码模式,你可以通过选择⼀个较慢的预设轻松地节省⽐特率。
如果你很有耐⼼,通常的建议是使⽤最慢的预设。⽬前所有的预设按照编码速度降序排列为:
tune是x264中重要性仅次于preset的选项,它是视觉优化的参数,tune可以理解为视频偏好(或者视频类型),tune不是⼀个单⼀的参数,⽽是由⼀组参数构成 -tune 来改变参数设置。当前的 tune包括:
如果你不确定使⽤哪个选项或者说你的输⼊与所有的tune皆不匹配,你可以忽略--tune 选项。 你可以使⽤-tune来查看tune列表,也可以通过x264 --fullhelp来查看tune所采⽤的参数配置。
另外⼀个可选的参数是-profile:v,它可以将你的输出限制到⼀个特定的 H.264 profile。⼀些⾮常⽼的或者 要被淘汰的设备仅⽀持有限的选项,⽐如只⽀持baseline或者main。
所有的profile 包括:
查找指定的编码器
初始化
设置编码器参数
将codec_ctx和codec进行绑定
分配pkt和frame
计算出每一帧的数据 像素格式 * 宽 * 高
读取YUV数据
格式化已经申请的内存,将YUV数据,格式化放入frame中
发送YUV数据进编码器
从编码器中获取encode的packet数据
encode的packet数据写入文件
绛旓細ffmpeg 灏辨槸寮哄ぇ鐨勫獟浣撴枃浠惰浆鎹㈠伐鍏枫傚畠鍙互杞崲浠讳綍鏍煎紡鐨勫獟浣撴枃浠讹紝骞朵笖杩樺彲浠ョ敤鑷繁鐨 AudioFilter 浠ュ強 VideoFilter 杩涜澶勭悊鍜岀紪杈戙傛帴涓嬫潵浠嬬粛涓涓瑙g爜鐨勫疄渚嬶紝璇ュ疄渚嬪疄鐜扮殑鍔熻兘闈炲父鍗曚竴锛屽氨鏄妸涓涓棰戞枃浠惰В鐮佹垚鍗曠嫭鐨勯煶棰慞CM鏂囦欢鍜瑙嗛YUV鏂囦欢銆侫VFormatContext鏄疉PI灞傜洿鎺ユ帴瑙﹀埌鐨勭粨鏋勪綋锛屽畠浼氳繘琛...
绛旓細// Free the YUV frame av_free(pFrame); // Close the codec avcodec_close(pCodecCtx); // Close the video file av_close_input_file(pFormatCtx); return 0;}杩欐槸缃戜笂鎵剧殑浠g爜,鑷繁淇敼浜嗕竴涓,鍙互璇诲彇瑙嗛,骞舵妸瑙嗛涓殑甯ц浆鎴愬搴旂殑bmp鍥剧墖銆瑙g爜鍚庣殑瑙嗛鏈潵灏辨槸yuv鏍煎紡鐨,鍙渶瑕佸啓鍏ュ埌鐩稿簲鐨勬枃...
绛旓細YUV420涓昏鏍煎紡锛歴tride鍙互缈昏瘧涓猴細璺ㄨ窛銆佹闀 stride鎸囧湪鍐呭瓨涓瘡琛屽儚绱犳墍鍗犵殑绌洪棿銆傚涓嬪浘鎵绀猴紝涓轰簡瀹炵幇鍐呭瓨瀵归綈锛屾瘡琛屽儚绱犲湪鍐呭瓨涓墍鍗犵殑绌洪棿骞朵笉鏄浘鍍忕殑瀹藉害銆傚湪鍥惧儚鏁版嵁浼犺緭鍜屾樉绀虹殑杩囩▼涓湁涓涓笉甯哥敤鐨勫弬鏁帮細闂磋窛銆傚畠鏈夊緢澶氱殑鍒悕锛屽湪浣跨敤d3d鏄剧ず鐨勬椂鍊欙紝瀹冨彨pitch锛涘湪鐢ffmpeg瑙g爜鐨勬椂鍊欙紝瀹...
绛旓細ffmpeg鈥搒w*h鈥損ix_fmtyuv420p鈥搃input.yuv 鈥搗codecmpeg4output.avi 9.甯哥敤鍙傛暟璇存槑锛氫富瑕佸弬鏁帮細i 璁惧畾杈撳叆娴 f 璁惧畾杈撳嚭鏍煎紡 ss 寮濮嬫椂闂 瑙嗛鍙傛暟锛歜 璁惧畾瑙嗛娴侀噺锛岄粯璁や负200Kbit/s-r 璁惧畾甯ч熺巼锛岄粯璁や负25 s 璁惧畾鐢婚潰鐨勫涓庨珮-aspect 璁惧畾鐢婚潰鐨勬瘮渚 vn 涓嶅鐞嗚棰-vcodec 璁惧畾瑙嗛缂瑙g爜...
绛旓細鍦ㄨ繃婊や箣鍚庯紝甯ц浼犻掑埌缂栫爜鍣紝缂栫爜鍣ㄥ苟杈撳嚭缂栫爜鐨勬暟鎹寘銆 鏈鍚庯紝杩欎簺浼犻掔粰澶嶇敤鍣紝灏嗙紪鐮佺殑鏁版嵁鍖呭啓鍏ヨ緭鍑烘枃浠躲傞粯璁ゆ儏鍐典笅锛ffmpeg鍙寘鍚緭鍏ユ枃浠朵腑姣忕绫诲瀷锛瑙嗛锛岄煶棰戯紝瀛楀箷锛夌殑涓涓祦锛屽苟灏嗗叾娣诲姞鍒版瘡涓緭鍑烘枃浠朵腑銆 瀹冩牴鎹互涓嬫爣鍑嗘寫閫夋瘡涓涓殑鈥滄渶浣斥濓細瀵逛簬瑙嗛锛屽畠鏄叿鏈夋渶楂樺垎杈ㄧ巼鐨勬祦锛...
绛旓細 鍖呭惈涓浜涘叕鍏辩殑宸ュ叿鍑芥暟鐨勪娇鐢ㄥ簱锛屽寘鎷畻鏁拌繍绠 瀛楃鎿嶄綔锛沴ibswresample 鍘熷闊抽鏍煎紡杞爜銆俵ibswscale 锛堝師濮瑙嗛鏍煎紡杞崲锛夌敤浜庤棰戝満鏅瘮渚嬬缉鏀俱佽壊褰╂槧灏勮浆鎹紱鍥惧儚棰滆壊绌洪棿鎴栨牸寮忚浆鎹紝濡 rgb565,rgb888 绛変笌 yuv420 绛変箣闂磋浆鎹傞煶瑙嗛瑙5灏佽娴佺▼锛ffmpeg瑙g爜娴佺▼锛
绛旓細鏈杩戦渶瑕佸仛瀹炴椂褰曞睆骞舵妸瑙嗛鎺ㄦ祦鍒癛TSP鏈嶅姟鍣紝鍏蜂綋娴佺▼鏄姄鍙栧睆骞曞唴瀹(bitmap)锛屽苟鎶奲itmap杞寲涓篩UV锛屾帴鐫鎶YUV缂栫爜鎴怘264锛屽啀鎶奌264鐮佹祦鎺ㄥ埌RTSP鏈嶅姟鍣紱鎶婇噰闆嗗埌鐨凱CM缂栫爜涓篈AC锛屽啀鎶夾AC鎺ㄦ祦鑷砇TSP鏈嶅姟鍣ㄣ傜湅浜嗛浄绁炵殑涓绡囨枃绔狅細 鏈绠鍗曠殑鍩轰簬FFmpeg鐨勬帹娴佸櫒锛堜互鎺ㄩ丷TMP涓轰緥锛 锛屼粬鏄妸鏈湴鐨...
绛旓細娣卞叆鎺㈣FFmpeg鐨瑙嗛瑙g爜娴佺▼锛氬叧閿粨鏋勪笌瀹炴垬婕旂ず鍦ㄥ濯掍綋寮鍙戜腑锛孎Fmpeg鏄竴涓笉鍙垨缂虹殑宸ュ叿锛屽挨鍏跺湪澶勭悊瑙嗛瑙g爜鏃躲傛湰鏂囧皢甯︽偍璧拌繘FFmpeg鐨勮棰戣В鐮佷笘鐣岋紝浠庡熀纭姒傚康鍒板疄璺垫搷浣滐紝涓姝ユ鎻ず鍏舵牳蹇冪粍浠跺拰瑙g爜娴佺▼銆傞鍏堬紝璁╂垜浠仛鐒︿簬涓や釜鍏抽敭缁撴瀯浣擄細AVFormatContext鍜孉VCodec銆侫VFormatContext鏄疐Fmpeg鐨勫熀鐭...
绛旓細鎺ㄦ祦娑夊強鐨勪富瑕佹楠ゅ寘鎷細棣栧厛锛岄夋嫨鏈湴瑙嗛浣滀负杈撳叆锛岄氳繃FFmpeg鎵撳紑骞跺垱寤鸿緭鍑鸿棰戞祦涓婁笅鏂囷紝閰嶇疆codec_id鍜宑odec_tag浠ョ‘瀹氭暟鎹缂栫爜绫诲瀷銆傝繖閲岋紝codec_tag鏄敤浜庤缁嗘弿杩扮紪瑙g爜鏍煎紡鐨勶紝濡侫V_CODEC_ID_RAWVIDEO鍙兘瀵瑰簲YUV鎴朢GB鏍煎紡锛岃孉V_CODEC_ID_H264鍒欐湁澶氫釜缁嗗寲绫诲瀷銆傚湪鍐欏叆瑙嗛鏁版嵁鏃讹紝闇瑕佺‘淇濆抚...
绛旓細x264杞欢鍜ffmpeg閮界洿鎺ュ彲浠ヨ浆鎹264 姣斿鍛戒护 ffmpeg -i source.yuv -vcodec libx264 -vb 1000k outfile.mp4