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]