美文网首页
NDK 音视频的直播推流与流媒体播放

NDK 音视频的直播推流与流媒体播放

作者: carlwu_186 | 来源:发表于2022-06-12 09:06 被阅读0次

Java层的native方法和C/C++层的函数建立对应关系有两种方式:

  • 静态注册
    Java 层的 native 方法与 native 层的方法在名称上具有一一对应的关系
  • 动态注册
    使用动态注册时,我们需要准备好需要自己想要对应的 native 方法,然后构造 JNINativeMethod 数组,JNINativeMethod 是一种结构体,源码如下:
typedef struct {
    // Java层native方法名称
    const char* name;
    // 方法签名
    const char* signature;
    // native层方法指针
    void*       fnPtr;
} JNINativeMethod;

动态注册的步骤如下:

  1. 通过 vm( Java 虚拟机)参数获取 JNIEnv 变量
  2. 通过 FindClass 方法找到对应的 Java 类
  3. 通过 RegisterNatives 方法,传入 JNINativeMethod 数组,注册 native 函数

视频流播放总结

  • 使用ffmpeg引擎进行直播流的decode
  • 使用OpenSLES进行音频的播放
  1. ffmpeg打开直播流地址后得到音、视频的解码器,分别实例化AudioChannel和VideoChannel
  2. 使用av_read_frame方法读取AVPacket,根据AVPacket的类型放入AudioChannel或VideoChannel的队列中缓存
  3. 音频的播放:从AudioChannel的AVPacket队列中循环读取AVPacket,使用AVCodecContext解码出AVFrame,读出AVFrame的内容使用OpenSLES进行播放音频。
  4. 视频的播放:从VideoChannel的AVPacket队列中循环读取AVPacket,使用AVCodecContext解码出AVFrame,AVFrame再放入一个队列中缓存。
    循环读取AVFrame的缓存队列得到AVFrame,SDK层的Surface在native_window_jni中可以得到ANativeWindow对象,将AVFrame的数据拷贝到ANativeWindow对象中即可。
  5. 音视频如何同步:可以获取AVFrame的播放时间基点和延迟时长。当播放时间基点==0时,休眠延迟时长后渲染图像。当播放时间基点!=0时,需要比较音频和视频当前的时间基点误差,误差较大时如果视频比音频快就需要让视频播放额外延迟这个时间误差,如果视频比音频慢比较明显(>=0.1s)就要丢弃当前的AVFrame,并且将AVPacket缓存队列一直删除到最近的KeyFrame位置。

直播推流总结

服务端可以用:nginx-rtmp-win32-1.2.1 实现。

播放器填入推流地址就可以实现直播观看。

app核心流程介绍:
↓↓↓↓↓↓↓↓↓↓↓↓
摄像头采集的视频数据为NV21格式。
往RTMP包中填充的是H.264数据。
x264是一个C语言编写的目前对H.264标准支持最完善的编解码库。
而x264编码的输入数据却为I420格式。
因此,当我们采集到摄像头数据之后需要将NV21转为I420。
但不是直接将x264编码出来的数据填充进RTMP包中。

因此视频数据的数据流过程为:
摄像头采集回调(NV21) -> 数据旋转(I420) -> x264编码(H.264) -> 去除分隔符(可以填充进RTMP包)

===========================

麦克风采集的音频数据为PCM格式。
RTMP推流需要的是aac的裸数据。
可以使用FAAC编码PCM数据为AAC格式。
推送音频第一个包包含了接下来数据的格式的音频序列包。

因此音频数据的数据流过程为:
麦克风采集回调(PCM) -> FAAC转码(AAC) -> 添加固定包头(可以填充进RTMP包)

涉及到的lib:x264、RTMPDump 、faac。

相关文章

  • NDK 音视频的直播推流与流媒体播放

    Java层的native方法和C/C++层的函数建立对应关系有两种方式: 静态注册Java 层的 native 方...

  • 视频推流

    直播技术? 姿势:摄像头采集,音视频编解码,流媒体协议,音视频流推送到流媒体服务器,流媒体网络分发,用户播放器,音...

  • Android流媒体开发之路二:NDK C++开发Android

    NDK C++开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编...

  • iOS 直播技术简介

    一、直播App架构 采集端将采集到的音视频数据通过推流地址推送到服务器,播放端再通过拉流地址将音视频数据拉到本地播...

  • FFmpeg常用命令(7)--直播相关命令

    直播中的推流、拉流等。 1.直播推流 参数说明:-re:减慢帧率速度,因为本地视频播放都是以较大的帧率进行播放,在...

  • iOS直播APP-点赞动画的实现

    因工作需要,高仿【喵播】的Demo核心功能基本完成。直播端音视频采集、推流、内置音乐播放器系统,播放端的视频拉流播...

  • Android直播之基本概念(二)

    1.直播的采集端(推流端)和播放端 直播的流程: 播放流程: 获取流–>解码–>播放录制播放路程: 录制音频视频–...

  • 如何快速开发一个iOS直播项目

    开发一个直播产品涉及到很多技术,主要有音视频采集,美颜,编码和解码(软编和硬编),封包,推流,拉流,播放,聊天,礼...

  • LiveQing二次开发接口对接说明示列

    LiveQing云端流媒体服务软件,支持视频视频转码、RTMP推流直播、RTMP/HLS/HTTP-FLV直播分发...

  • 玩转直播学习全套件

    最近学习的总结!首先来介绍下简单的推流.iOS 直播 —— 推流推流,就是将采集到的音频,视频数据通过流媒体协议发...

网友评论

      本文标题:NDK 音视频的直播推流与流媒体播放

      本文链接:https://www.haomeiwen.com/subject/qjzisrtx.html