文章目录

  • 安卓直播推流专栏博客总结
  • 一、 Camera 传感器方向简介
  • 二、 Camera 图像传感器横向显示数据
  • 三、 Camera 图像传感器纵向显示数据
  • 四、 设置 Camera 预览数据方向
  • 五、 Camera 使用流程
  • 六、 Camera 动态权限申请

安卓直播推流专栏博客总结


Android RTMP 直播推流技术专栏 :

0 . 资源和源码地址 :

  • 资源下载地址 : 资源下载地址 , 服务器搭建 , x264 , faac , RTMPDump , 源码及交叉编译库 , 本专栏 Android 直播推流源码 ;
  • GitHub 源码地址 : han1202012 / RTMP_Pusher

1. 搭建 RTMP 服务器 : 下面的博客中讲解了如何在 VMWare 虚拟机中搭建 RTMP 直播推流服务器 ;

  • 【Android RTMP】RTMP 直播推流服务器搭建 ( Ubuntu 18.04.4 虚拟机 )

2. 准备视频编码的 x264 编码器开源库 , 和 RTMP 数据包封装开源库 :

  • 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )

  • 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )

3. 讲解 RTMP 数据包封装格式 :

  • 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | 文件头 Header 分析 | 标签 Tag 分析 | 视频标签 Tag 数据分析 )

  • 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | AVC 序列头格式解析 )

4. 图像数据采集 : 从 Camera 摄像头中采集 NV21 格式的图像数据 , 并预览该数据 ;

  • 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

  • 【Android RTMP】Android Camera 视频数据采集预览 ( NV21 图像格式 | I420 图像格式 | NV21 与 I420 格式对比 | NV21 转 I420 算法 )

  • 【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )

5. NV21 格式的图像数据编码成 H.264 格式的视频数据 :

  • 【Android RTMP】x264 编码器初始化及设置 ( 获取 x264 编码参数 | 编码规格 | 码率 | 帧率 | B帧个数 | 关键帧间隔 | 关键帧解码数据 SPS PPS )

  • 【Android RTMP】x264 图像数据编码 ( Camera 图像数据采集 | NV21 图像数据传到 Native 处理 | JNI 传输字节数组 | 局部引用变量处理 | 线程互斥 )

  • 【Android RTMP】x264 图像数据编码 ( NV21 格式中的 YUV 数据排列 | Y 灰度数据拷贝 | U 色彩值数据拷贝 | V 饱和度数据拷贝 | 图像编码操作 )

6. 将 H.264 格式的视频数据封装到 RTMP 数据包中 :

  • 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 封装 SPS / PPS 数据包 )

  • 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 关键帧数据格式 | 非关键帧数据格式 | x264 编码后的数据处理 | 封装 H.264 视频数据帧 )

  • 【Android RTMP】RTMPDump 推流过程 ( 独立线程推流 | 创建推流器 | 初始化操作 | 设置推流地址 | 启用写出 | 连接 RTMP 服务器 | 发送 RTMP 数据包 )

7. 阶段总结 : 阿里云服务器中搭建 RTMP 服务器 , 并使用电脑软件推流和观看直播内容 ;

  • 【Android RTMP】RTMP 直播推流 ( 阿里云服务器购买 | 远程服务器控制 | 搭建 RTMP 服务器 | 服务器配置 | 推流软件配置 | 直播软件配置 | 推流直播效果展示 )

  • 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )

8. 处理 Camera 图像传感器导致的 NV21 格式图像旋转问题 :

  • 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )

  • 【Android RTMP】NV21 图像旋转处理 ( 图像旋转算法 | 后置摄像头顺时针旋转 90 度 | 前置摄像头顺时针旋转 90 度 )

9. 下面这篇博客比较重要 , 里面有一个快速搭建 RTMP 服务器的脚本 , 强烈建议使用 ;

  • 【Android RTMP】NV21 图像旋转处理 ( 快速搭建 RTMP 服务器 Shell 脚本 | 创建 RTMP 服务器镜像 | 浏览器观看直播 | 前置 / 后置摄像头图像旋转效果展示 )

10. 编码 AAC 音频数据的开源库 FAAC 交叉编译与 Android Studio 环境搭建 :

  • 【Android RTMP】音频数据采集编码 ( 音频数据采集编码 | AAC 高级音频编码 | FAAC 编码器 | Ubuntu 交叉编译 FAAC 编码器 )

  • 【Android RTMP】音频数据采集编码 ( FAAC 头文件与静态库拷贝到 AS | CMakeList.txt 配置 FAAC | AudioRecord 音频采样 PCM 格式 )

11. 解析 AAC 音频格式 :

  • 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )

12 . 将麦克风采集的 PCM 音频采样编码成 AAC 格式音频 , 并封装到 RTMP 包中 , 推流到客户端 :

  • 【Android RTMP】音频数据采集编码 ( FAAC 音频编码参数设置 | FAAC 编码器创建 | 获取编码器参数 | 设置 AAC 编码规格 | 设置编码器输入输出参数 )

  • 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频解码信息 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )

  • 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频采样数据 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )


Android 直播推流流程 : 手机采集视频 / 音频数据 , 视频数据使用 H.264 编码 , 音频数据使用 AAC 编码 , 最后将音视频数据都打包到 RTMP 数据包中 , 使用 RTMP 协议上传到 RTMP 服务器中 ;

Android 端中主要完成手机端采集视频数据操作 , 并将视频数据传递给 JNI , 在 NDK 中使用 x264 将图像转为 H.264 格式的视频 , 最后将 H.264 格式的视频打包到 RTMP 数据包中 , 上传到 RTMP 服务器中 ;

本篇博客中主要讲解 Android 端数据采集 , Camera 摄像头获取 NV21 数据后 , 此时预览数据方向是错误的 , 因为 Camera 图像传感器采集数据时 , 始终以手机右上角为原点 , NV21 数据的图像信息也是倒着的 ;

一、 Camera 传感器方向简介


1 . Camera 采集 NV21 图像数据 : 手机 Camera 采集的图像数据完毕后 , 通过 PreviewCallback 接口的 onPreviewFrame 回调方法获取 NV21 图像数据 ;

2 . NV21 图像数据来源 : 该数据的最底层来源是手机 Camera 硬件的图像传感器 ;

3 . 图像传感器采集图像机制 :

① 图像传感器坐标原点 : 图像传感器取景时有一个坐标原点 , 就是手机的右上角 ;

② 图像传感器坐标方向 : 从图像传感器原点 / 手机右上角 ( 0 , 0 ) 向右下角方向是 X 增加方向 , 从图像传感器原点 / 手机右上角 ( 0 , 0 ) 向左上角方向是 Y 增加方向 ;

二、 Camera 图像传感器横向显示数据


1 . 向左横向 : 当手机向左横放时 , 图像传感器原点及方向 , 屏幕的原点及方向如下 ;

① 传感器原点和方向 : 图像传感器 ( 手机右上角 ) 原点 (0,0)( 0 , 0 )(0,0) , 向右 X 增加 , 向下 Y 增加 ;

② 屏幕原点和方向 : 手机屏幕当前左上角 ( 手机的右上角 ) 是屏幕原点 , 向右 X 增加 , 向下 Y 增加 ;

2 . 图像显示 : 屏幕传感器的方向与屏幕方向一致 , 此时没有显示图像传感器 : 横向界面的 Camera 采集的图像数据是正常的 ;

注意 : 这是向左横向显示的数据 , 如果向右横向 , 数据整个都倒过来了 ;

三、 Camera 图像传感器纵向显示数据


1 . 正常竖屏 : 此时还是以右上角为原点 , 采集横向图像 ,

① 传感器原点和方向 : 图像传感器 ( 手机右上角 ) 原点 (0,0)( 0 , 0 )(0,0) , 向右 X 增加 , 向下 Y 增加 ;

② 屏幕原点和方向 : 手机屏幕当前左上角 ( 手机的右上角 ) 是屏幕原点 , 向右 X 增加 , 向下 Y 增加 ;

2 . 图像显示 : 屏幕传感器的方向与屏幕方向不一致 , 此时没有显示图像传感器 , 纵向数据是不正常的 , 此时垂直方向显示界面时 , 显示的拍照信息还是横向的 , 只是 Camera 采集的图像逆时针旋转了 90 度 ;

注意 : 这是向上纵向显示的数据 , 如果向下纵向 , 数据整个都倒过来了 ;

四、 设置 Camera 预览数据方向


1 . 纠正图像预览方向 : Google 官方提供了设置 Camera 预览方向的方式 , 以下代码定义在 Camera#setDisplayOrientation 文档注释中 , 为 Camera 设置了以下参数后 , 就不会有上述预览图像错误的问题产生 ;

2 . NV21 数据方向 : NV21 格式的图像数据的的实际方向还是错误的方向 , 需要用户自己使用时纠正 ;

    /*** 设置 Camera 预览方向* 如果不设置, 视频是颠倒的* 该方法内容拷贝自 {@link Camera#setDisplayOrientation} 注释, 这是 Google Docs 提供的* @param parameters*/private void setCameraPreviewOrientation(Camera.Parameters parameters) {Camera.CameraInfo info = new Camera.CameraInfo();Camera.getCameraInfo(mCameraFacing, info);mRotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();int degrees = 0;switch (mRotation) {case Surface.ROTATION_0:degrees = 0;break;case Surface.ROTATION_90:degrees = 90;break;case Surface.ROTATION_180:degrees = 180;break;case Surface.ROTATION_270:degrees = 270;break;}int result;if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {result = (info.orientation + degrees) % 360;result = (360 - result) % 360; // compensate the mirror} else { // back-facingresult = (info.orientation - degrees + 360) % 360;}mCamera.setDisplayOrientation(result);}

五、 Camera 使用流程


1 . 开启 Camera 摄像头 :

    /*** 开启 Camera 摄像头*/private void startCameraNV21DataPreview() {try {Log.i("octopus", "startCameraNV21DataPreview");// 1. 打开指定方向的 Camera 摄像头mCamera = Camera.open(mCameraFacing);// 2. 获取 Camera 摄像头参数, 之后需要修改配置该参数Camera.Parameters parameters = mCamera.getParameters();// 3. 设置 Camera 采集后预览图像的数据格式 ImageFormat.NV21parameters.setPreviewFormat(ImageFormat.NV21);// 4. 设置摄像头预览尺寸setPreviewSize(parameters);// 5. 设置图像传感器参数setCameraPreviewOrientation(parameters);mCamera.setParameters(parameters);// 6. 计算出 NV21 格式图像 mWidth * mHeight 像素数据大小mNv21DataBuffer = new byte[mWidth * mHeight * 3 / 2];// 7. 设置 Camera 预览数据缓存区mCamera.addCallbackBuffer(mNv21DataBuffer);// 8. 设置 Camera 数据采集回调函数, 采集完数据后//    就会回调此 PreviewCallback 接口的//    void onPreviewFrame(byte[] data, Camera camera) 方法mCamera.setPreviewCallbackWithBuffer(this);// 9. 设置预览图像画面的 SurfaceView 画布mCamera.setPreviewDisplay(mSurfaceHolder);// 11. 开始预览mCamera.startPreview();} catch (Exception ex) {ex.printStackTrace();}}

2 . 释放 Camera 摄像头 :

    /*** 释放 Camera 摄像头*/private void stopCameraNV21DataPreview() {if (mCamera != null) {// 下面的 API 都是 Android 提供的// 1. 设置预览回调接口, 这里设置 null 即可mCamera.setPreviewCallback(null);// 2. 停止图像数据预览mCamera.stopPreview();// 3. 释放 CameramCamera.release();mCamera = null;}}

六、 Camera 动态权限申请


1 . Android 6.0 以下静态设置权限 : AndroidManifest.xml 设置静态权限 ;

    <uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.RECORD_AUDIO" />

2 . Android 6.0 以上动态获取权限 :

    /*** 需要获取的权限列表*/private String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.INTERNET,Manifest.permission.MODIFY_AUDIO_SETTINGS,Manifest.permission.RECORD_AUDIO,Manifest.permission.CAMERA};/*** 动态申请权限的请求码*/private static final int PERMISSION_REQUEST_CODE = 888;/*** 动态申请权限*/@RequiresApi(api = Build.VERSION_CODES.M)private void initPermissions() {if (isLacksPermission()) {//动态申请权限 , 第二参数是请求吗requestPermissions(permissions, PERMISSION_REQUEST_CODE);}}/*** 判断是否有 permissions 中的权限* @return*/@RequiresApi(api = Build.VERSION_CODES.M)public boolean isLacksPermission() {for (String permission : permissions) {if(checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){return true;}}return false;}

【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )相关推荐

  1. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  2. Android 10.0获取本地视频及其预览图

    打开本地视频选择器 private void openLocalVideo(){Intent intent = new Intent();intent.setAction(Intent.ACTION_ ...

  3. Android 视频 短视频录制预览尺寸(简单几款机型测试)

    Android 视频 短视频录制预览尺寸(简单几款机型测试) 贴出下列2表目的也是便于大家对一般相机照片和预览主流尺寸有个大概了解 SurfaceView 照片支持尺寸 Picture Nexus 5 ...

  4. android 录像 视频大小,Android相机 – 录制视频时预览放大

    我一直试图弄清楚一段时间,但由于某种原因,当我开始使用相机录制视频时,预览放大.我从以下示例中获取以下代码: @Override public void surfaceChanged(SurfaceH ...

  5. Android Camera2 教程 · 第三章 · 预览

    Android Camera2 教程 · 第三章 · 预览 DarylGo关注 Android Camera 上一章<Camera2 开启相机>我们学习了如何开启和关闭相机,接下来我们来学 ...

  6. Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)...

    Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...

  7. 谷歌发布 Android 8.1 首个开发者预览版,优化内存效率

    今晨,谷歌推出了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化,其中包含对 Android Go (设备运行内存小于等于 1 GB)和加速设备上对机器学习的全新神经网 ...

  8. android自定义相机预览尺寸,相机在Android中,如何获得最佳尺寸,预览尺寸,图片尺寸,视图尺寸,图像扭曲...

    混合来自OpenGL和 Android相机的视图时图像失真,以便在使用takepicture方法时获取两者的图像.我查了一下,发现相机图片设置为640X480,openGL视图和相机预览都设置为128 ...

  9. Android拍照指定尺寸,相机在Android中,如何获得最佳尺寸,预览尺寸...

    混合来自OpenGL和Android相机的视图时图像失真,以便在使用takepicture方法时获取两者的图像.我查了一下,发现相机图片设置为640X480,openGL视图和相机预览都设置为1280 ...

最新文章

  1. Python 列表生成式的使用
  2. php ajax评论系统,Ajax / jQuery评论系统 - php
  3. 打开word文档提示文件未找到_word图片显示:如何打开多图文档不再卡慢
  4. hdu-4539 郑厂长系列故事――排兵布阵(状态压缩)
  5. 使用EntityFrameworkCore实现Repository, UnitOfWork,支持MySQL分库分表
  6. Andorid之KeyguardManager的介绍
  7. 【神兵利器】介绍一款支持屏幕录制、滚动截图、高清长图、图片编辑、图片转PDF格式、屏幕取色的截图软件:FastStone Capture
  8. ztek usb转串口 linux,Z-Tek USB转串口驱动
  9. CSS居中对齐的方法
  10. 网易前端JavaScript编码规范
  11. 你知道 DNS,那我猜你一定不知道 HTTPDNS
  12. win10系统vs2019 mpich配置
  13. 物理画线“救救小鸡”,支持自建关卡!技术教程分享
  14. JQuery学习22篇(事件委托)
  15. CheckBox选中触发事件 和 取消选中触发事件
  16. 神童频现,这到底是人性的扭曲还是?
  17. 徐登科浅谈币圈:从口罩现在只需0.9元/只,看看机会变成陷阱最短需要多久呢?
  18. Linux离线安装yarn和配置离线仓库
  19. 获取qq音乐分享链接
  20. 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操

热门文章

  1. System.Timers.Timer与System.Windows.Forms.Timer 区别
  2. springboot 异步不生效
  3. java 线程池ThreadPoolExecutor
  4. 电脑开机出现C:\Windows\System32\drivers\fs_rec.sys
  5. for、for / in循环
  6. Python做web开发,推荐几个能立马上手的小项目
  7. C# 关于调用微信接口的代码
  8. web前端面试题(含答案)
  9. [UE4]把工程升级到最新版本
  10. Android AsyncTask分析