很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型:

1. Android摄像头前后camera通过OnPreviewFrame()回调的数据接口:

    @Overridepublic void onPreviewFrame(byte[] data, Camera camera) {frameCount++;if (frameCount % 3000 == 0) {Log.i("OnPre", "gc+");System.gc();Log.i("OnPre", "gc-");}if (data == null) {Parameters params = camera.getParameters();Size size = params.getPreviewSize();int bufferSize = (((size.width | 0x1f) + 1) * size.height * ImageFormat.getBitsPerPixel(params.getPreviewFormat())) / 8;camera.addCallbackBuffer(new byte[bufferSize]);} else {if (isRTSPPublisherRunning || isPushingRtmp || isRecording || isPushingRtsp) {libPublisher.SmartPublisherOnCaptureVideoData(publisherHandle, data, data.length, currentCameraType, currentOrigentation);}camera.addCallbackBuffer(data);}}

对应接口定义:

/*** Set live video data(no encoded data).** @param cameraType: CAMERA_FACING_BACK with 0, CAMERA_FACING_FRONT with 1* * @param curOrg:* PORTRAIT = 1;    //竖屏* LANDSCAPE = 2;    //横屏 home键在右边的情况* LANDSCAPE_LEFT_HOME_KEY = 3; //横屏 home键在左边的情况** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoData(long handle, byte[] data, int len, int cameraType, int curOrg);

2. 部分定制设备,只支持YV12的数据:

    /*** YV12数据接口** @param data: YV12 data** @param width: 图像宽** @param height: 图像高** @param y_stride:  y面步长** @param v_stride: v面步长** @param u_stride: u面步长** rotation_degree: 顺时针旋转, 必须是0, 90, 180, 270** @return {0} if successful*/public native int SmartPublisherOnYV12Data(long handle, byte[] data, int width, int height, int y_stride,  int v_stride, int u_stride, int rotation_degree);

3. 支持NV21数据接口:

nv21数据接口,除了用于常规的camera数据接入外,部分定制摄像头出来的数据发生翻转,这个接口也支持。

    /*** NV21数据接口** @param data: nv21 data** @param len: data length** @param width: 图像宽** @param height: 图像高** @param y_stride:  y面步长** @param uv_stride:  uv面步长** rotation_degree: 顺时针旋转, 必须是0, 90, 180, 270** @return {0} if successful*/public native int SmartPublisherOnNV21Data(long handle, byte[] data, int len, int width, int height, int y_stride,  int uv_stride, int rotation_degree);/*** NV21数据接口** @param data: nv21 data** @param len: data length** @param width: 图像宽** @param height: 图像高** @param y_stride:  y面步长** @param uv_stride:  uv面步长** rotation_degree: 顺时针旋转, 必须是0, 90, 180, 270** @param  is_vertical_flip: 是否垂直翻转, 0不翻转, 1翻转** @param  is_horizontal_flip:是否水平翻转, 0不翻转, 1翻转** @return {0} if successful*/public native int SmartPublisherOnNV21DataV2(long handle, byte[] data, int len, int width, int height, int y_stride,  int uv_stride, int rotation_degree,int is_vertical_flip, int is_horizontal_flip);

4. 支持YUV数据接入:

    /*** Set live video data(no encoded data).** @param data: I420 data* * @param len: I420 data length* * @param yStride: y stride* * @param uStride: u stride* * @param vStride: v stride** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoI420Data(long handle,  byte[] data, int len, int yStride, int uStride, int vStride);

5. 支持RGBA数据接入(支持裁剪后数据接入,主要用于同屏场景):

    /*** Set live video data(no encoded data).** @param data: RGBA data* * @param rowStride: stride information* * @param width: width* * @param height: height** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoRGBAData(long handle,  ByteBuffer data, int rowStride, int width, int height);/*** 投递裁剪过的RGBA数据** @param data: RGBA data** @param rowStride: stride information** @param width: width** @param height: height** @param clipedLeft: 左;  clipedTop: 上; clipedwidth: 裁剪后的宽; clipedHeight: 裁剪后的高; 确保传下去裁剪后的宽、高均为偶数** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoClipedRGBAData(long handle,  ByteBuffer data, int rowStride, int width, int height, int clipedLeft, int clipedTop, int clipedWidth, int clipedHeight);/*** Set live video data(no encoded data).** @param data: ABGR flip vertical(垂直翻转) data** @param rowStride: stride information** @param width: width** @param height: height** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoABGRFlipVerticalData(long handle,  ByteBuffer data, int rowStride, int width, int height);

6. 支持RGB565数据接入(主要用于同屏场景):

    /*** Set live video data(no encoded data).** @param data: RGB565 data** @param row_stride: stride information** @param width: width** @param height: height** @return {0} if successful*/public native int SmartPublisherOnCaptureVideoRGB565Data(long handle,ByteBuffer data, int row_stride, int width, int height);

7. 支持camera数据接入(主要用于camera2接口对接):

/**  专门为android.media.Image的android.graphics.ImageFormat.YUV_420_888格式提供的接口** @param  width: 必须是8的倍数** @param  height: 必须是8的倍数** @param  crop_left: 剪切左上角水平坐标, 一般根据android.media.Image.getCropRect() 填充** @param  crop_top: 剪切左上角垂直坐标, 一般根据android.media.Image.getCropRect() 填充** @param  crop_width: 必须是8的倍数, 填0将忽略这个参数, 一般根据android.media.Image.getCropRect() 填充** @param  crop_height: 必须是8的倍数, 填0将忽略这个参数,一般根据android.media.Image.getCropRect() 填充** @param y_plane 对应android.media.Image.Plane[0].getBuffer()** @param y_row_stride 对应android.media.Image.Plane[0].getRowStride()** @param u_plane 对应android.media.Image.Plane[1].getBuffer()** @param v_plane 对应android.media.Image.Plane[2].getBuffer()** @param uv_row_stride 对应android.media.Image.Plane[1].getRowStride()** @param uv_pixel_stride 对应android.media.Image.Plane[1].getPixelStride()** @param  rotation_degree: 顺时针旋转, 必须是0, 90, 180, 270** @param  is_vertical_flip: 是否垂直翻转, 0不翻转, 1翻转** @param  is_horizontal_flip:是否水平翻转, 0不翻转, 1翻转** @param  scale_width: 缩放宽,必须是8的倍数, 0不缩放** @param  scale_height: 缩放高, 必须是8的倍数, 0不缩放** @param  scale_filter_mode: 缩放质量, 范围必须是[1,3], 传0使用默认速度** @return {0} if successful*/public native int SmartPublisherOnImageYUV420888(long handle, int width, int height,int crop_left, int crop_top, int crop_width, int crop_height,ByteBuffer y_plane, int y_row_stride,ByteBuffer u_plane, ByteBuffer v_plane, int uv_row_stride, int uv_pixel_stride,int rotation_degree, int is_vertical_flip, int is_horizontal_flip,int scale_width, int scale_height, int scale_filter_mode);

8. 支持PCM数据接入:

    /*** 传递PCM音频数据给SDK, 每10ms音频数据传入一次* *  @param pcmdata: pcm数据, 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.*  @param size: pcm数据大小*  @param sample_rate: 采样率,当前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推荐44100*  @param channel: 通道, 当前通道支持单通道(1)和双通道(2),推荐单通道(1)*  @param per_channel_sample_number: 这个请传入的是 sample_rate/100*/public native int SmartPublisherOnPCMData(long handle, ByteBuffer pcmdata, int size, int sample_rate, int channel, int per_channel_sample_number);/*** 传递PCM音频数据给SDK, 每10ms音频数据传入一次**  @param pcmdata: pcm数据, 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.*  @param offset: pcmdata的偏移*  @param size: pcm数据大小*  @param sample_rate: 采样率,当前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推荐44100*  @param channel: 通道, 当前通道支持单通道(1)和双通道(2),推荐单通道(1)*  @param per_channel_sample_number: 这个请传入的是 sample_rate/100*/public native int SmartPublisherOnPCMDataV2(long handle, ByteBuffer pcmdata, int offset, int size, int sample_rate, int channel, int per_channel_sample_number);/*** 传递PCM音频数据给SDK, 每10ms音频数据传入一次**  @param pcm_short_array: pcm数据, short是native endian order*  @param offset: 数组偏移*  @param len: 数组项数*  @param sample_rate: 采样率,当前只支持{44100, 8000, 16000, 24000, 32000, 48000}, 推荐44100*  @param channel: 通道, 当前通道支持单通道(1)和双通道(2),推荐单通道(1)*  @param per_channel_sample_number: 这个请传入的是 sample_rate/100*/public native int SmartPublisherOnPCMShortArray(long handle, short[] pcm_short_array, int offset, int len, int sample_rate, int channel, int per_channel_sample_number);

9. 支持远端PCM数据接入和混音后PCM数据接入(主要用于一对一互动):

/*** Set far end pcm data* * @param pcmdata : 16bit pcm data* @param sampleRate: audio sample rate* @param channel: auido channel* @param per_channel_sample_number: per channel sample numbers* @param is_low_latency: if with 0, it is not low_latency, if with 1, it is low_latency* @return {0} if successful*/public native int SmartPublisherOnFarEndPCMData(long handle,  ByteBuffer pcmdata, int sampleRate, int channel, int per_channel_sample_number, int is_low_latency);/*** 传递PCM混音音频数据给SDK, 每10ms音频数据传入一次**  @param stream_index: 当前只能传1, 传其他返回错误*  @param pcm_data: pcm数据, 需要使用ByteBuffer.allocateDirect分配, ByteBuffer.isDirect()是true的才行.*  @param offset: pcmdata的偏移*  @param size: pcm数据大小*  @param sample_rate: 采样率,当前只支持{44100, 8000, 16000, 24000, 32000, 48000}*  @param channels: 通道, 当前通道支持单通道(1)和双通道(2)*  @param per_channel_sample_number: 这个请传入的是 sample_rate/100*/public native int SmartPublisherOnMixPCMData(long handle, int stream_index, ByteBuffer pcm_data, int offset, int size, int sample_rate, int channels, int per_channel_sample_number);/*** 传递PCM混音音频数据给SDK, 每10ms音频数据传入一次**  @param stream_index: 当前只能传1, 传其他返回错误*  @param pcm_short_array: pcm数据, short是native endian order*  @param offset: 数组偏移*  @param len: 数组项数*  @param sample_rate: 采样率,当前只支持{44100, 8000, 16000, 24000, 32000, 48000}*  @param channels: 通道, 当前通道支持单通道(1)和双通道(2)*  @param per_channel_sample_number: 这个请传入的是 sample_rate/100*/public native int SmartPublisherOnMixPCMShortArray(long handle, int stream_index, short[] pcm_short_array, int offset, int len, int sample_rate, int channels, int per_channel_sample_number);

总结:

以上只是编码前数据接口,一个产品如果想做的足够通用,需要对接的太多了,你觉得呢?

Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结相关推荐

  1. Windows平台RTMP推送|轻量级RTSP服务实现本地摄像头|屏幕|叠加数据预览

    背景 大家在做Windows平台RTMP推送或轻量级RTSP服务的时候,不管是采集屏幕还是采集摄像头,亦或屏幕摄像头的叠加模式,总会有这样的诉求,采集到的数据,希望能本地看看具体采集的数据或者图像实际 ...

  2. 轻量级RTSP服务模块和RTSP推流模块适用场景区别

    好多开发者一直搞不清轻量级RTSP服务SDK和RTSP推流SDK的区别(Github下载地址),以下是相关区别: 1. 轻量级RTSP服务模块:轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独 ...

  3. Android平台RTMP/RTSP播放器开发系列之解码和绘制

    本文主要抛砖引玉,粗略介绍下Android平台RTMP/RTSP播放器中解码和绘制相关的部分(Github). 解码 提到解码,大家都知道软硬解,甚至一些公司觉得硬解码已经足够通用,慢慢抛弃软解了,如 ...

  4. 轻量级RTSP服务SDK

    为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,大牛直播SDK在推送端发布了轻量级RTSP服务SDK: 简单来说,之前推送端SDK支持的功能,内置轻量级RTSP服务SDK后, ...

  5. [轻量级RTSP服务]Linux|麒麟操作系统下实现屏幕|系统声音采集

    背景 随着国产操作系统的推进,传统行业对Linux平台的呼声和需求越来越大,之前几年,我们发布了Linux平台运营商级的RTSP转RTMP推送模块.RTMP推送模块和RTSP.RTMP播放模块,前段时 ...

  6. 如何用轻量级RTSP服务本地生成RTSP测试URL

    最近发现好多开发者都在搜索可用的RTSP测试URL,目前公网实际可测试的RTSP URL非常少,即便是可用,分辨率和网络也非常差,不适合长期测试. 针对此,我们的建议是最好直接网上买个海康或大华的摄像 ...

  7. 轻量级RTSP服务存在的意义

    为什么要设计轻量级RTSP服务 轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务. 轻量级RTSP服务可满足内网无纸化/电子教室等内网超低延迟的低并发需求,避免让用 ...

  8. rtsp有没有好使_轻量级RTSP服务和内置RTSP网关有什么不同?

    好多开发者疑惑,什么是内置RTSP网关,和轻量级RTSP服务又有什么区别和联系?本文就以上问题,做个简单的介绍: 轻量级RTSP服务 为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的 ...

  9. 轻量级RTSP服务和内置RTSP网关的区别和联系

    好多开发者疑惑,什么是内置RTSP网关,和轻量级RTSP服务又有什么区别和联系?本文就以上问题,做个简单的介绍: 轻量级RTSP服务 为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的 ...

最新文章

  1. 大道至简第一章观后感(伪代码)
  2. Pass4side CompTIA PK0-002题库下载
  3. Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版
  4. httpclient 调取接口_HttpClient调用接口发送文件
  5. python numpy array转置_详解Numpy数组转置的三种方法T、transpose、swapaxes
  6. oracle一页显示15行,oracle rownum分页与显示记录小测
  7. 安装oracle 10g闪退,Windows 7安装Oracle 10g常见错误及解决方法
  8. 再谈shell之“/dev/null 21”
  9. 用51单片机和esp8266实现通过手机app控制单片机小灯
  10. 数据仓库与数据挖掘归纳汇总
  11. 批改网作文提交时分析不出来_推荐一款免费英语写作批改软件
  12. 比较热门的物联网服务器的使用
  13. coreldraw怎么改成半圆形_cdr怎么把图形修剪成指定的形状?
  14. 第27月第25天 clang -rewrite-objc main.m
  15. lammps npt系综iso和aniso控压对比
  16. 上海交通大学计算机系非全日制,关于上海交通大学非全日制研究生中最便宜的专业...
  17. 从蓄水池算法到大数据算法一般性的一点看法
  18. 互联网的女性主义特征(姜奇平)
  19. (二)Linux嵌入式开发——软件安装(Ubuntu)
  20. 做一个像人的3d人物建模需要通过什么技术和怎样的资金达成?

热门文章

  1. python绘制星空_用python画星空源代码是什么?
  2. mac预装的php路径,Mac使用系统自带php和Apache
  3. [转载] JAVA笔记_(Day04,Day05)函数数组
  4. 如何设置单词第一个字母大写_大写一行中每个单词的第一个和最后一个字母
  5. ICWAI和ICWA的完整形式是什么?
  6. python字符串转浮点数_Python | 打印不同的值(整数,浮点数,字符串,布尔值)...
  7. 百度地图手机和电脑不一致_你可能不知道的电脑手机冷知识
  8. jsp 嵌入java_关于JSP里的Java语句嵌入问题
  9. 人工智能ai 学习_学习代理| 人工智能
  10. JavaScript中的If和Else语句(香草)