Android NDK 直播推流与引流,flutterui套件

本文探讨了如何在Android平台上利用NDK进行直播推流操作,详细介绍了通过AudioRecord进行音频采集并传入Native层进行编码的过程,同时提及了与Flutter UI的集成应用。
摘要由CSDN通过智能技术生成

if (mIsPushing) {

mNativePush.fireVideo(bytes);

}

}

音频采集 音频采集基于 AudioRecord 实现,在一个子线程采集音频 PCM 数据,并将数据不断传入 Native 层进行编码。

private class AudioRecordRunnable implements Runnable {



@Override

public void run() {

mAudioRecord.startRecording();

while (mIsPushing) {

//通过AudioRecord不断读取音频数据

byte[] buffer = new byte[mMinBufferSize];

int length = mAudioRecord.read(buffer, 0, buffer.length);

if (length > 0) {

//传递给 Native 代码,进行音频编码

mNativePush.fireAudio(buffer, length);

}

}

}

} 





**编码和推流**



音视频数据编码和推流在 Native 层实现,首先添加 faac , x264 , librtmp 第三方库到 AS 工程,然后初始化相关设置,基于生产者与消费者模式,将编码后的音视频数据,在生产者线程中打包 RTMPPacket 放入双向链表,在消费者线程中从链表中取 RTMPPacket ,通过 RTMP\_SendPacket 方法发送给服务器。



x264 初始化:





JNIEXPORT void JNICALL

Java_com_haohao_live_jni_NativePush_setVideoOptions(JNIEnv *env, jobject instance, jint width,

jint height, jint bitRate, jint fps) {



x264_param_t param;

//x264_param_default_preset 设置

x264_param_default_preset(¶m, "ultrafast", "zerolatency");

//编码输入的像素格式YUV420P

param.i_csp = X264_CSP_I420;

param.i_width = width;

param.i_height = height;



y_len = width * height;

u_len = y_len / 4;

v_len = u_len;



//参数i_rc_method表示码率控制,CQP(恒定质量),CRF(恒定码率),ABR(平均码率)

//恒定码率,会尽量控制在固定码率

param.rc.i_rc_method = X264_RC_CRF;

param.rc.i_bitrate = bitRate / 1000; //* 码率(比特率,单位Kbps)

param.rc.i_vbv_max_bitrate = bitRate / 1000 * 1.2; //瞬时最大码率



//码率控制不通过timebase和timestamp,而是fps

param.b_vfr_input = 0;

param.i_fps_num = fps; //* 帧率分子

param.i_fps_den = 1; //* 帧率分母

param.i_timebase_den = param.i_fps_num;

param.i_timebase_num = param.i_fps_den;

param.i_threads = 1;//并行编码线程数量,0默认为多线程



//是否把SPS和PPS放入每一个关键帧

//SPS Sequence Parameter Set 序列参数集,PPS Picture Parameter Set 图像参数集

//为了提高图像的纠错能力

param.b_repeat_headers = 1;

//设置Level级别

param.i_level_idc = 51;

//设置Profile档次

//baseline级别,没有B帧,只有 I 帧和 P 帧

x264_param_apply_profile(¶m, "baseline");



//x264_picture_t(输入图像)初始化

x264_picture_alloc(&pic_in, p
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一: 使用javacv来实现,最终也是用过ffmpeg来进行编码和推流,javacv实现到可以直接接收摄像头的帧数据 需要自己实现的代码只是打开摄像头,写一个SurfaceView进行预览,然后实现PreviewCallback将摄像头每一帧的数据交给javacv即可 javacv地址:https://github.com/bytedeco/javacv demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master 二: 使用Android自带的编码工具,可实现硬编码,这里有一个国内大神开源的封装很完善的的库yasea,第一种方法需要实现的Camera采集部分也一起封装好了,进行一些简单配置就可以实现编码推流,并且yasea目前已经直接支持摄像头的热切换,和各种滤镜效果 yasea地址(内置demo):https://github.com/begeekmyfriend/yasea 服务器 流媒体服务器我用的是srs,项目地址:https://github.com/ossrs/srs 关于srs的编译、配置、部署、在官方wiki中已经写的很详细了,并且srs同样是国内开发人员开源的项目,有全中文的文档,看起来很方便 这里有最基本的简单编译部署过程 Android直播实现(二)srs流媒体服务器部署 播放器 android端的播放使用vitamio,还是国内的开源播放器,是不是感觉国内的前辈们越来越屌了^~^! vitamio支持几乎所有常见的的视频格式和流媒体协议 vitamio地址(内置demo):https://github.com/yixia/VitamioBundle 这里使用的是yaesa库,先介绍一下直播实现的流程:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值