LiteralliJeff 发表于 2022-2-26 11:56

Android视频直播之摄像头 3.1 传输 -- protobuf对象序列化

1、官网介绍,https://developers.google.cn/protocol-buffers,可以当作一个小插件,有自己的的编程语言结构,上手很容易,下面开始:

2、AndroidStudio 集成protobuf

2.1 在project工程目录下的build.gradle 中

dependencies{

classpath'com.google.protobuf:protobuf-gradle-plugin:0.8.8'

}

2.2 在app工程目录下的build.gradle 中添加
apply plugin:'com.android.application'

apply plugin:'com.google.protobuf'

2.3在app工程目录下的build.gradle 中添加

dependencies{

api 'com.google.protobuf:protobuf-lite:3.0.0'

}

2.4 手写自定义protocol类,名字随便取,以.proto后缀结尾


2.5 看下类中具体代码怎么写,

syntax = "proto3";//版本

package com.ltx.netty.chat;//包名,自定义

option java_outer_classname = "NettyMessage";//build构建后的java类名

//需要以message开头,RegisterProto自定义,1,2,3... 每新增一个属性就加1

//类型string对应java String

//类型int32对应java int

//类型int32对应java int

//类型bytes对应java byte[]

message RegisterProto{

string from = 1;//发送者

string to = 2;//接受者

int32 type = 3;//消息类型

string content = 4;//String消息扩展,json即可

bytes frame = 5;//数据流:视频流,文件流。

}

2.6 安装AndroidStudio插件 可以更好的编写,有提示,能更方便编写。

plugins 搜索 protocol buffer editor,安装重启as即可

2.7 结合netty发送消息,还记得netty 连接服务器成功后,会得到一个socketChannel

public void sendMsg(NMessage message,Callback callback) {

NettyLibUtils.i("NettyPushService sendMsg " + message);

if (socketChannel ==null){

Log.i("NettyPushService","socketChannel = null" );

return;

   }

NettyMessage.RegisterProto.Builder builder =NettyMessage.RegisterProto.newBuilder();

builder.setFrom(message.getFrom());

builder.setType(message.getType());

builder.setTo(message.getTo());

builder.setContent(message.getContent());

builder.setFrame(ByteString.copyFrom(message.getFrame()));

socketChannel.writeAndFlush(builder)

.addListener((ChannelFutureListener) future -> {

if (future.isSuccess()) {

if (callback !=null) {

callback.onEvent(1,"发送成功",null);

}

}else {

if (callback !=null) {

callback.onEvent(MsgCode.LOGIN_OUT,"发送失败",null);

}

}

});

}

2.8 服务端消息处理,客户端和服务端一样,只介绍服务端,客户端记得要切换主线使用消息

自定义类NettyServerMultiHandler继承SimpleChannelInboundHandler,需要在服务器和客户端注册

socketChannel.pipeline().addLast(new NettyServerMultiHandler());

类代码如下

public class NettyServerMultiHandler extends SimpleChannelInboundHandler{

@Override

protected void channelRead0(ChannelHandlerContext ctx,Object msg) {

if (msg instancof NettyMessage.RegisterProto){

NettyMessage.RegisterProto message = (NettyMessage.RegisterProto) msg;

          //todo 处理业务逻辑

}

}

netty结合protobuf使用,传输层就介绍完了。见4 直播间解码
页: [1]
查看完整版本: Android视频直播之摄像头 3.1 传输 -- protobuf对象序列化