android提供了一个强大的编解码类MediaCodec,可以实现对视频数据的编解码,下面讲一下如何对原始视频数据硬编码成h264格式的流
MediaCodec提供两种方式的输入,一种是将数据写入它的输入缓冲队列里,一种是让MediaCodec建立一个输入Surface,MediaCodec会自动从这个输入Surface中读取数据,因为我做的是录制屏幕的需求,所以我是使用一个Surface输入数据给MediaCodec。MediaCodec编码出来的头两帧是特殊的,分别是sps 和 pps这两帧在解码时要用来配置解码器用的。下面贴出编码器代码,这里我做的是视频实时编码传输,所以编码后的数据我使用socket发送的,大家主要还是看看编码部分的代码就好了:
package com.seewo.seewoair.coder;
/**
* @author zhangsutao
* @file VideoCodec.java
* @brief 视频编解码器基类
* @date 2016/8/7
*/
public interface VideoCodec {
String MIME_TYPE = "video/avc";
int VIDEO_FRAME_PER_SECOND = 15;
int VIDEO_I_FRAME_INTERVAL = 5;
int VIDEO_BITRATE = 500 * 8 * 1000;
}
/**
* @author zhangsutao
* @file VideoEncoder.java
* @brief 视频编码器
* @date 2016/7/29
*/
public class VideoEncoder implements VideoCodec {
private Worker mWorker;
private MediaProjection mMediaProjection;
private VirtualDisplay mVirtualDisplay;
private Client mClient;
//写入本地的流,在调试的时候使用
private DataOutputStream mOutput;
private final boolean isDebug=true;
private final String TAG="VideoEncoder";
private byte[] mFrameByte;
public VideoEncoder(MediaProjection mediaProjection,Client client) {
mClient=client;
mMedi