Windows 下利用 ffplay 进行引流,命令行执行:
ffplay rtmp://192.168.0.0/live/test
ip 地址换成流媒体服务器的地址, test 表示直播房间号
测试结果:
本文直播推流步骤:
-
使用 AudioRecord 采集音频,使用 Camera API 采集视频数据
-
分别使用 faac 和 xh264 第三方库在 Native 层对音频和视频进行编码
-
利用 rtmp-dump 第三方库进行打包和推流
工程目录:
主要的 JNI 方法:
public class NativePush {
public native void startPush(String url);
public native void stopPush();
public native void release();
/**
-
设置视频参数
-
@param width
-
@param height
-
@param bitrate
-
@param fps
*/
public native void setVideoOptions(int width, int height, int bitrate, int fps);
/**
-
设置音频参数
-
@param sampleRateInHz
-
@param channel
*/
public native void setAudioOptions(int sampleRateInHz, int channel);
/**
-
发送视频数据
-
@param data
*/
public native void fireVideo(byte[] data);
/**
-
发送音频数据
-
@param data
-
@param len
*/
public native void fireAudio(byte[] data, int len);
}
视频采集
视频采集主要基于 Camera 相关 API ,利用 SurfaceView 进行预览,通过 PreviewCallback 获取相机预览数据。
视频预览主要代码实现:
public void startPreview(){
try {
mCamera = Camera.open(mVideoParams.getCameraId());
Camera.Parameters param = mCamera.getParameters();
List<Camera.Size> previewSizes = param.getSupportedPreviewSizes();
int length = previewSizes.size();
for (int i = 0; i < length; i++) {
Log.i(TAG, "SupportedPreviewSizes : " + previewSizes.get(i).width + “x” + previewSizes.get(i).height);
}
mVideoParams.setWidth(previewSizes.get(0).width);
mVideoParams.setHeight(previewSizes.get(0).height);
param.setPreviewFormat(ImageFormat.NV21);