android直播性能优化,实现简易的android 直播技术

529fea5d44c7c3046629775eb13171b4.png

Android 的直播,主要使用的是camera采集的数据推流到服务器上,在客户端播放camera采集的数据。采用SurfaceView+ SurfaceTexture来显示camera数据, SurfaceTexture在接收图像流之后,可以进行二次处理,比如(加字体水印), 处理完毕后再送给另一个SurfaceView用于显示.

先说说,android端采集摄像头数据,这个网上有很多的资料,可以百度下。这里可以在回调函数OnPreviewFrame(byte[] data,Camera cma)中获取摄像头数据data.

关键是如何把data传输到服务器,要实现这个目标,我使用ffmpeg 来解决这个为题。在android 工程创建jni文件夹,使用jni调用。native函数如下:

// 在OnPreviewFrame中调用

public native void push(byte[] data);

// 可以在OnSurfcaeChanged()中调用. 在jni中初始化输出路径.

public native int initPush(String outputurl,int width,int height);

在jni 层的代码如下:

static void ffmpeg_init() {

avcodec_register_all();

#if CONFIG_AVDEVICE

avdevice_register_all();

#endif

avfilter_register_all();

av_register_all();

avformat_network_init();

}

static int avinit(int width, int height){

/**编码开始*/

int ret;

if(codec==NULL){

yuv_width = width;

yuv_height = height;

y_length = width * height;

uv_length = width * height / ;

LOGI("init start\n");

codec = avcodec_find_encoder(AV_CODEC_ID_H264);

if (!codec) {

LOGI("Codec not found\n");

return -;

}

c = avcodec_alloc_context3(codec);

if (!c) {

LOGI("Could not allocate video codec context\n");

return -;

}

/* put sample parameters */

c->bit_rate = ;

/* resolution must be a multiple of two */

c->width = width;

c->height = height;

/* frames per second */

//c->time_base = (AVRational){1,5};

c->time_base.den = ;

c->time_base.num = ;

/* emit one intra frame every ten frames

* check frame pict_type before passing frame

* to encoder, if frame->pict_type is AV_PICTURE_TYPE_I

* then gop_size is ignored and the output of encoder

* will always be I frame irrespective to gop_size

*/

if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)

c->flags |= CODEC_FLAG_GLOBAL_HEADER;

c->gop_size = ;

c->max_b_frames = ;

c->pix_fmt = AV_PIX_FMT_YUV420P;

//av_opt_set(c->priv_data, "preset", "slow", 0);

av_opt_set(c->priv_data, "preset", "superfast", );

av_opt_set(c->priv_data, "tune", "zerolatency", );

/* open it */

if (avcodec_open2(c, codec, NULL) < ) {

LOGI("Could not open codec\n");

return -;

}

LOGI("init end 1\n");

video_st = avformat_new_stream(ofmt_ctx, codec);

if (video_st == NULL) {

LOGI("video_st == NULL\n");

return -;

}

video_st->time_base.num = ;

video_st->time_base.den = ;

video_st->codec = c;

return ;

}

/**编码结束*/

}

JNIEXPORT jint JNICALL Java_com_example_directvideo_MainActivity_initPush

(JNIEnv *env, jobject obj,jstring out ,jint width, jint height){

int ret ;

ffmpeg_init();

const char* str = //"rtmp://192.168.1.102:1935/myapp/test1";

//"/storage/emulated/0/zsy.mp4";

(*env)->GetStringUTFChars(env, out, );

LOGI("%s %d %d ", str,width,height);

//AVOutputFormat *ofmt = NULL;

//AVFormatContext *ofmt_ctx = NULL;

//Output

avformat_alloc_output_context2(&ofmt_ctx, NULL, "flv", str); //RTMP

//avformat_alloc_output_context2(&ofmt_ctx, NULL, "mpegts", output_str);//UDP

if (!ofmt_ctx) {

LOGI( "Could not create output context\n");

ret = AVERROR_UNKNOWN;

goto end;

}

ret = avinit(width, height);

ofmt = ofmt_ctx->oformat;

//Open output URL

if (!(ofmt->flags & AVFMT_NOFILE)) {

ret = avio_open(&ofmt_ctx->pb, str, AVIO_FLAG_WRITE);

if (ret < ) {

LOGI( "Could not open output URL '%s'", str);

goto end;

}

}

ret = avformat_write_header(ofmt_ctx, NULL);

if (ret < ) {

LOGE( "Error occurred when opening output URL\n");

goto end;

}

(*env)->ReleaseStringUTFChars(env, out, str);

if (ret < && ret != AVERROR_EOF) {

LOGI( "Error occurred.\n");

return ret;

}

intited = ;

return ;

}

注意传输视频流时,必须使用h264编码器进行编码。初始化成功后,便可使用push()来推送每一帧的camera数据到服务器上。

本人在ubuntu系统中,利用ngnix + rtmp搭建了简易的流媒体服务器。

在pc机上,使用ffplay rtmp://192.168.1.102:1935/myapp/test1的命令来播放视屏.

「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

手游录屏直播技术详解 &vert; 直播 SDK 性能优化实践

在上期中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...

从无到有开发连麦直播技术&lt&semi;转&gt&semi;

转贴地址:http://blog.csdn.net/heisedelangzi/article/details/52400333 从无到有开发连麦直播技术点整理-AnyRTC 直播关键字 采集.前处理 ...

Android开发技术周报

Android开发技术周报 原文  http://androidweekly.cn/android-dev-weekly-issue48/ 教程 深入理解Android之Gradle Gradle是当 ...

最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复

最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复 最新实战教程,Android自己主动化刷量.作弊与防作弊,案例:刷友盟统计.批量注冊苹果帐号 这个系列的文章将会研究最纯粹的Android ...

最纯粹的直播技术实战02-Camera的处理以及推流

最纯粹的直播技术实战02-Camera的处理以及推流 最新实战教程.Android自己主动化刷量.作弊与防作弊.案例:刷友盟统计.批量注冊苹果帐号 这个系列的文章将会研究最纯粹的Android直播的实 ...

视频直播技术之iOS端推流

随着网络基础建设的发展和资费的下降,在这个内容消费升级的时代,文字.图片无法满足人们对视觉的需求,因此视频直播应运而生.承载了实时性Real-Time和交互性的直播云服务是直播覆盖各行各业的新动力.网 ...

&lbrack;转载&rsqb; Android逃逸技术汇编

本文转载自: http://blogs.360.cn/360mobile/2016/10/24/android_escape/ 摘    要 传统逃逸技术涉及网络攻防和病毒分析两大领域,网络攻防领域涉 ...

随机推荐

项目中angular js的接口url统一管理

为了防止环境改变时需要修改多处接口的url,项目中用到了一个config.json文件来统一管理url: 在src下建立config文件夹,创建config.json文件,主要内容如下: { &quo ...

Nginx内置变量

$args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...

在C&num;中使用C&plus;&plus;编写的类

现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...

MySQL的Explain解释器的部分理解

Explain 部分说明进行解释 (1) Extra列的Using Where 表示在进行过滤后在进行Where语句的过滤 (2) type为ref,直接按索引顺序返回,没有 Using fileso ...

Apache Spark shell的实例操作

1.scala> val inFile = sc.textFile("./spam.data") 作用是将spam.data当作文本文件加载到Spark中,将spam.dat ...

C&num; 对JS编码&sol;解码进行转换

public static class Extension { #region [编码/解码统一转换] /// /// /// /// ...

SetConsoleScreenBufferSize 函数--设置控制台屏幕缓冲区大小

SetConsoleScreenBufferSize函数 来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686044(v= ...

June 15&period; 2018 Week 24th Friday

If at first you don't succeed, then dust yourself off and try again. 失败了没关系,重振旗鼓,从头再来. From Aaliyah, ...

tomcat优化实例

———————————————————————————————————— 一.运行模式优化 修改tomcat运行模式为nio

Qt 串口类QSerialPort 使用笔记

Qt 串口类QSerialPort 使用笔记 虽然现在大多数的家用PC机上已经不提供RS232接口了.但是由于RS232串口操作简单.通讯可靠,在工业领域中仍然有大量的应用.Qt以前的版本中,没有提供 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值