首页 > 系统 > Android > 正文

Android视频数据采集,H.264编码

2019-11-07 23:34:53
字体:
来源:转载
供稿:网友

Andriod视频采集

在Android端通过摄像头可以采集到视频数据,通过

parameters.setPReviewFormat(ImageFormat.NV21)通过adb logcat -s jw可以查看支持的格式,一般是NV21,YV12

可以指定视频的格式! 采集完成后的数据buffer就可以传到JNI层,进行格式转换以及编码!

NV,YUV格式转换

Android端采集完成的数据是NV21的,需要转换成YUV420P后,进行H.264编码!

NV21与YUV420P都是属于YUV420格式,每四个Y共用一组UV分量,区别是UV分量的空间排列不同,因此只需要将NV21的UV调换成YUV的VU即可!

H.264编码

预设参数

关于H.264编码,我们可以参照源码里面的example.c!首先需要设置相关的参数,然后再进行编码! 主要调用的几个函数:

x264_param_default_preset 设置x264_param_apply_profile 设置档次x264_picture_alloc(x264_picture_t输入图像)初始化x264_encoder_open 打开编码器x264_encoder_encode 编码x264_encoder_close( h ) 关闭编码器,释放资源

开始编码

调用x264_encoder_encode开始编码得到一系列的NALU! 在编码成功后,就可以使用RTMP协议将编码的数据发送出去!

帧分为关键帧和普通帧,为了提高画面的纠错能力,需要将SPS(序列参数集),以及PPS(图像参数集)添加到关键帧的前面,让每个关键帧I帧都附带sps,pps!

NALU数组SPS,PPS处理

在读出一系列的NALU数据之后,需要将读出SPS,PPS帧数据,放到关键帧前面,提高画面的纠错能力! NALU结构如下: 这里写图片描述

所以在读出SPS,PPS的时候,去掉NALU之间的起始码,保存数据!

for (; i < nal_data; i++) { if (nal_data[i].i_type == NAL_SPS) { sps_len = nal_data[i].p_payload - 4; //不复制四字节起始码 memcpy(sps, nal_data[i].p_payload + 4, sps_len); } else if (nal_data[i].i_type == NAL_PPS) { pps_len = nal_data[i].i_payload - 4; //不复制四字节起始码 memcpy(pps, nal_data[i].p_payload + 4, pps_len); //发送序列信息 } else { //发送帧信息 } }

后面将通过RTMP协议将NALU序列信息推送到服务器!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表