获取SPS、PPS
ByteBuffer spsb = videoEncodec.getOutputFormat().getByteBuffer("csd-0");
byte[] sps = new byte[spsb.remaining()];
spsb.get(sps, 0, sps.length);
ByteBuffer ppsb = videoEncodec.getOutputFormat().getByteBuffer("csd-1");
byte[] pps = new byte[ppsb.remaining()];
ppsb.get(pps, 0, pps.length);
LivePushActivity
package com.example.glivepush;
import android.os.Bundle;
import android.os.Environment;
import android.se.omapi.SEService;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.glivepush.camera.GCameraView;
import com.example.glivepush.push.GConnectListener;
import com.example.glivepush.push.PushEncodec;
import com.example.glivepush.push.PushVideo;
import com.example.glivepush.util.DisplayUtil;
public class LivePushActivity extends AppCompatActivity {
private PushVideo pushVideo;
/***************************************获取MediaCodec sps pps******************start***********/
private GCameraView gCameraView;
private boolean start = false;
private PushEncodec pushEncodec;
/***************************************获取MediaCodec sps pps*******************end************/
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_push);
pushVideo = new PushVideo();
/***************************************获取MediaCodec sps pps******************start***********/
gCameraView = findViewById(R.id.cameraView);
/***************************************获取MediaCodec sps pps*******************end************/
pushVideo.setgConnectListener(new GConnectListener() {
@Override
public void onConnecting() {
Log.d("godv", "链接服务器中");
}
@Override
public void onConnectSuccess() {
Log.d("godv", "链接服务器成功");
/***************************************获取MediaCodec sps pps******************start***********/
pushEncodec = new PushEncodec(LivePushActivity.this, gCameraView.getTextureId());
pushEncodec.initEncodec(
gCameraView.getEglContext(),
DisplayUtil.getScreenWidth(LivePushActivity.this),
DisplayUtil.getScreenHeight(LivePushActivity.this),
44100,
2
);
pushEncodec.startRecord();
/***************************************获取MediaCodec sps pps*******************end************/
}
@Override
public void onConnectFail(String msg) {
Log.d("godv", msg);
}
});
}
public void startPush(View view) {
/***************************************获取MediaCodec sps pps******************start***********/
start = !start;
if (start) {
pushVideo.initLivePush("rtmp://192.168.0.14/myapp/mystream");
} else {
if (pushEncodec != null) {
pushEncodec.stopRecord();
pushEncodec = null;
}
}
/***************************************获取MediaCodec sps pps*******************end************/
}
}
BasePushEncoder
package com.example.glivepush.push;
import android.content.Context;
import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.MediaFormat;
import android.media.MediaMuxer;
import android.util.Log;
import android.view.Surface;
import com.example.glivepush.egl.EglHelper;
import com.example.glivepush.egl.GEGLSurfaceView;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import javax.microedition.khronos.egl.EGLContext;
public abstract class BasePushEncoder {
private Surface surface;
private EGLContext eglContext;
private int width;
private int height;
//视频的编码器
private MediaCodec videoEncodec;
private MediaFormat videoFormat;
private MediaCodec.BufferInfo videoBufferinfo;
//音频的编码器
private MediaCodec audioEncodec;
private MediaFormat audioFormat;
private MediaCodec.BufferInfo audioBufferinfo;
private long audioPts = 0;
private int sampleRate = 0;
//渲染视频的线程
private GEGLMediaThread geglMediaThread;
//编码视频的线程
private VideoEncodecThread videoEncodecThread;
//编码音频的线程
private AudioEncodecThread audioEncodecThread;
private GEGLSurfaceView.GGLRender gGLRender;
public final static int RENDERMODE_WHEN_DIRTY = 0;
public final static int RENDERMODE_CONTINUOUSLY = 1;
private int mRenderMode = RENDERMODE_CONTINUOUSLY;
private OnMediaInfoListener onMediaInfoListener;
public void setOnMediaInfoListener(OnMediaInfoListener onMediaInfoListener) {
this.onMediaInfoListener = onMe

本文介绍了一个音视频编码的实现方案,包括获取SPS和PPS序列参数集、使用MediaCodec进行视频编码、创建并配置视频编码器、启动编码过程以及处理编码后的数据。
最低0.47元/天 解锁文章
1382

被折叠的 条评论
为什么被折叠?



