mediaCodec.start();
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
while (isLiving){
//若时间差大于 2 s,则通知编码器,生成 I 帧
if (System.currentTimeMillis() - timeStamp >= 2000){
// Bundle 通知 Dsp
Bundle msgBundle = new Bundle();
msgBundle.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME,0);
mediaCodec.setParameters(msgBundle);
timeStamp = System.currentTimeMillis();
}
// 接下来就是 MediaCodec 常规操作,获取 Buffer 可用索引,这里不需要获取输出索引,内部已经操作了
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo,100_000);
if (outputBufferIndex >=0){
// 获取到了
ByteBuffer byteBuffer = mediaCodec.getOutputBuffer(outputBufferIndex);
byte[] outData = new byte[bufferInfo.size];
byteBuffer.get(outData);
}
}
}
Rtmp 数据包
经过上面两步,我们获得了编码好的 h264 数据,接下来封装 Rtmp 就比较头疼了(Ndk 的知识都忘得差不多了)
首先我们在项目的 cpp 文件中,把 Rtmpdump 的源代码导入,我们使用 rtmpdump 连接服务器,以及传输 Rtmp 数据,要知道目前手里的数据还是 h264 码流,是无法直接传输,需要封装成 Rtmp 数据包
使用第三方库 Rtmpdump 来实现推流到直播服务器,由于 Rtmpdump 的代码量不是很多,我们直接拷贝源代码到 Android 的 cpp 文件,如果需要用到 Ffmpeg 不能才用该种调用方式了,需要提前编译好 so 库文件
对 Rtmp 暂时不需要做太深刻的理解,因为很容易给自己绕进去,用 Rtmp 传输 h264 数据,那么 sps,pps ,以及关键帧怎么摆放,Rtmp 都已经规定好了,我们就需要使用 NDK 的方式,实现 rtmp 数据的填充
RtmpDump 的使用
- 连接服务器
-
RTMP_Init(RTMP *r) 初始化
-
RTMP_EnableWrite(RTMP *r) 配置开启数据写入
-
RTMP_Connect(RTMP *r, RTMPPacket *cp)
-
RTMP_ConnectStream(RTMP *r, int seekTime)
- 发送数据