RTMP服务器搭建参考:mac下Nginx搭建RTMP服务器_macos nginx-rtmp-module-优快云博客
h264格式,aac格式,rtmppacket格式参考:h264、AAC组装RTMPPacket_h264packager-优快云博客
环境:
RtmpDump c文件少,可以直接引入源文件,配置针对rtmpdump的cmakelist。
ndk 交叉编译android 平台下的 faac x264静态库,引入。
faac作用:将AudioRecord录制的pcm编码成aac。
x264作用:将camera2输出的原始图像,编码成h264.
rtmpdump:连接rtmp服务器,将aac和h264各自打包RtmpPacket,实现推流。
Java层AudioRecord和Camera2就不介绍了,直接进入native中开始讲解。
先看一下几个native 方法的作用。
public class RtmpPush {
static {
System.loadLibrary("rtmpPush");
}
/**
* 创建x264编码类和faac编码类
*/
public static native void native_init();
/**
* 连接rtmp服务器,推流开始
* @param path
*/
public static native void native_start(String path);
/**
* 初始化x264配置
* @param width
* @param height
* @param fps
* @param bitrate
*/
public static native void native_setVideoEncInfo(int width, int height, int fps, int bitrate);
/**
* yuv输入编码,推流
* @param ydata
* @param yLen
*/
public static native void native_pushVideo(
byte[] ydata, int yLen
);
public static native void native_stop();
public static native void native_release();
/**
* 初始化faac配置
* @param sampleRateInHz
* @param channels
*/
public static native void native_setAudioEncInfo(int sampleRateInHz, int channels);
/**
* 获取faac 输入buffer的大小,配置audioRecord的输入buffer大小
* @return
*/
public static native int getInputSamples();
/**
* pcm编码aac,推流
* @param data
*/
public static native void native_pushAudio(byte[] data);
}
native_init
extern "C"
JNIEXPORT void JNICALL
Java_com_example_rtmppushdemo_RtmpPush_native_1init(JNIEnv *env, jclass instance) {
videoChannel = new VideoChannel();
videoChannel->setVideoCallBack(callback);
audioChannel = new AudioChannel();
audioChannel->setAudioCallBack(callback);
packets.setReleaseCallback(releasePackets);
}
创建VideoChannel和AudioChannel。
VideoChannel:负责编码h264和组装rtmp。
AudioChannel:负责编码aac和组装rtmp。
native_start
void *task_start(void *args) {
char *url = static_cast<char *>(args);
RTMP *rtmp = 0;
do {
rtmp = RTMP_Alloc();
if (!rtmp) {
LOGE("alloc rtmp失败");
break;
}
RTMP_Init(rtmp);
int ret = RTMP_SetupURL(rtmp, url);
if (!ret) {
LOGE("设置地址失败:%s", url);
break;
}
rtmp->Link.timeout = 5;
RT