永发信息网

高分求教!解决问题还高分悬赏,我是新手,自己写android socket 接收视频流,为什么只显示一帧

答案:4  悬赏:10  手机版
解决时间 2021-03-10 23:47
我的服务器(arm linux)一直给android发送320*240的位图视频流。
下面给出android机器的run线程代码,我发现我只能提取出inputstream第一帧的数据,因为第二次读取就返回bBitmap 为空,报空指针错误
但是我如果加上if(bBitmap !=null)判断吧,第二次inputstream.read空可以跳过,但是第三次虽然不为空,显示还是的是第一次的那个画面,我下面的这个程序的现象是:第一帧->黑屏(因为加上if(bBitmap !=null)第二次根本没有执行draw,所以黑屏)->第一帧->黑屏->第一帧->黑屏.....
我查看了,服务器一直发送数据,android机器也一直接收socket的数据,但是就是死活读不出来,我接收的socket数据哪去了,小弟第一次用android开发,有笑话之处,望不要笑话
public void paintview()
{
sHolder = surfaceView.getHolder();
Paint paint=new Paint();
bCanvas=null;
bCanvas = new Canvas();

// 从Socket对象中得到OutputStream对象
try
{

if(inputStream==null)
Log.v("安卓手机:inputStream is null", "message");
else
{
Log.v("安卓手机:inputStream is not null", "message");
}
inputStream =socket.getInputStream();
Arrays.fill(totalBuffer,(byte)0);
Arrays.fill(buffer,(byte)0);//
length=0;
for(int lastLength = 0; ((length = inputStream.read(buffer,0,(W*H*3-length))) >0);
lastLength = lastLength + length)
{
System.arraycopy(buffer, 0,totalBuffer, lastLength, length);

}
}
catch (Exception e)
{
e.printStackTrace();
}
bBitmap=null;
if(totalBuffer==null)
Log.v("安卓手机:totalBuffer is null", "message");
else
{
Log.v("安卓手机:totalBuffer is not null", "message");
}
bBitmap = BitmapFactory.decodeByteArray(totalBuffer, 0, totalBuffer.length);
Log.v("安卓手机", "message");
bCanvas = sHolder.lockCanvas(new Rect(0,0,320,240));
Log.v("安卓手机:sHolder.lockCanvas", "message");
if(bBitmap==null)
Log.v("安卓手机:bBitmap is null", "message");
else
{
Log.v("安卓手机:bBimap is not null", "message");
}
if(bBitmap!=null)
bCanvas.drawBitmap(bBitmap, 0, 0, paint);
Log.v("安卓手机:drawBitmap", "message");
sHolder.unlockCanvasAndPost(bCanvas);
最佳答案
我去楼主,你怎么那么麻烦你不知道安卓里有这个 BitmapFactory.decodeBitmap(inputstream is);这个东西么
全部回答
你说只是绘制一帧,那我和你说说视频播放的原理,视频数据获取就不说了,你得到了转换成每一帧的图片,然后一帧一帧的绘制形成动画(视频),那你说你现在只绘制了一帧,就看这一帧是开始的还是最后结束的,开始的话,那就说明你的循环绘制没起作用(可以自己加线程),问题的源头你就找到了,剩下的就自己解局了;如果是最后一帧,那就是你代码错了
...首先佩服楼主不怕内存泄露.. 然后楼主你的代码里面最后显示的貌似就是那个bBitmap吧..那只是你提取出来的第一帧的图片..不是视频..然后你每次运行paintview这个类的时候都会把bBitmap重新赋值一次NULL那就是你为什么第二次进去会报空指针的原因了
大概看了一下你的程序,还没仔细分析,也不知道你的服务器端程序是什么样子,不过这边有几点提醒: 1.不知道你从服务器端传过来的数据到底是什么格式,如果是Bitmap对象的格式,估计一帧的大小不会是W*H*3,起码还有一些图片的头信息之类的,就像bitmap文件里面不会只存像素数据,还会有一些版本号,颜色表,长宽之类的数据。 2.bitmap得到null并不是说没有取到数据,很有可能是取到的数据不符合bitmap对象格式,你可以把收到的数据在转换成bitmap之前dump出来看看,跟服务器端发的数据是不是吻合。 3.综合1和2,第一帧能显示,是因为有bitmap文件头,虽然最后的像素数据不足,但是影响不大,第二帧黑屏很可能是把原来应该属于第一帧的最后的一些数据放到了第二帧的开头,造成认不了bitmap头,于是不能解析。至于第三帧为什么跟第一帧一样,还要再仔细分析你的程序,包括客户端的其他代码以及服务器端。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
下图甲、乙、丙分别表示在有限空间内培养(或
冉村村我想知道这个在什么地方
新买的 Kindle及kpw3屏幕有亮点,怎么办
TX Antenna Chains里的1+2是什么意思
很召完小六年级成绩单
【自是指物作诗立就】自是指物作诗立就是什么
21号太原限号是多少
桂桃饸饹面馆地址在哪,我要去那里办事
手机设备一键登录的账号密码是多少?
格勒村地址有知道的么?有点事想过去
速求经典老歌, 六七十年代的。 重重有赏。谢
不与水杨酸衍生物合用的是A.五倍子B.黄芩C.甘
我今天去抽签抽到个十三千能帮我解释一下吗
从铜仁南站怎么坐到凤凰古城 10分
明天要去买房子办理房贷,但银行卡昨天丢了,
推荐资讯
声音好听的女歌手有哪些?
《子夜》第一章中为什么吴老太爷一进入上海就
海里的青色螃蟹叫什么
【人加两笔所组成的字,急需·20个.人加两笔所
晚上睡觉镜子能放在床头吗
广州市番禺区动物检疫申报点在什么地方啊,我
栏杆高1.5米 距离墙1米 墙高不知道 放个梯子
克兹尔库都克怎么去啊,有知道地址的么
重阳节干什么
泰康人寿保险有限责任公司江西鹰潭余江支公司
uh-huh! listen boy! my first love story_ ~
庭琼宾馆地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?