我正在尝试将视频从树莓派相机流式传输到 android 应用程序。我的树莓派代码如下:
import io
import socket
import struct
import time
import picamera
listensocket=socket.socket()
Port=5004
maxConnections=999
IP=socket.gethostname()
print(IP)
listensocket.bind(('',Port))
listensocket.listen(maxConnections)
print('Server started at '+IP+' on Port'+str(Port))
(clientsocket,address)=listensocket.accept()
print("New Connection Made: "+str(address))
#listensocket.close()
running=True
#client_socket.connect(('192.168.0.131', 8000))
connection = clientsocket.makefile('wb')
try:
with picamera.PiCamera() as camera:
camera.resolution = (160, 120)
camera.framerate = 30
time.sleep(2)
start = time.time()
stream = io.BytesIO()
# Use the video-port for captures...
for foo in camera.capture_continuous(stream, 'jpeg',
use_video_port=True):
connection.write(struct.pack('<L', stream.tell()))
print(stream.tell())
connection.flush()
stream.seek(0)
connection.write(stream.read())
if time.time() - start > 30:
break
stream.seek(0)
stream.truncate()
connection.write(struct.pack('<L', 0))
finally:
connection.close()
client_socket.close()
Android端代码如下:
package com.example.networkvideo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.CompressFormat;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
ImageView imview;
public InputStream inputStream;
int newbytestoread;
private Socket s;
private boolean mconnectexception = false;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread cThread=new Thread(new clientThread());
cThread.start();
}
public class clientThread implements Runnable {
public void run(){
try {
s = new Socket("192.168.0.132", 5004);
if (s!=null){
Log.d(TAG, "Connection Successful..!");
while (true){
inputStream = s.getInputStream();
int bytesread=0;
int bytestoread=4;
int x=0;
byte[] input=new byte[bytestoread];
//int size=inputStream.read(input,0,4);
while (bytesread<bytestoread){
int result=inputStream.read(input,bytesread,bytestoread-bytesread);
if (result==-1){
break;
}
bytesread+=result;
}
x = java.nio.ByteBuffer.wrap(input).order(java.nio.ByteOrder.LITTLE_ENDIAN).getInt();
if(x==0){
break;
}
//String size=new String(x);
Log.d(TAG,"Image Length : "+ x);
//int newbytestoread=Integer.parseInt(size.trim());
int newbytestoread=x;
int newbytesread=0;
byte[] picturedata=new byte[newbytestoread];
Log.d(TAG,"Image array created");
while (newbytesread<newbytestoread){
int result=inputStream.read(picturedata,newbytesread,newbytestoread-newbytesread);
if(result==-1){
break;
}
newbytesread+=result;
//try{
//inputStream.read(picturedata,0,x);
//Log.d(TAG,"Image array populated");
String strpicturedata=new String(picturedata);
Log.d(TAG,"Image data: "+strpicturedata);
frame2video f2v = new frame2video();
f2v.execute(picturedata);
Log.d(TAG,"I am here");
}
//catch(IOException e){
// e.printStackTrace();
}
}
else{
mconnectexception=true;
}
} catch (IOException e) {
e.printStackTrace();
mconnectexception = true;
}
if (mconnectexception) {
Log.d(TAG, "Connection not Available");
}
}
}
public class frame2video extends AsyncTask<byte[], Void, Bitmap> {
@Override
protected void onPreExecute() {
imview=(ImageView)findViewById(R.id.imview);
}
@Override
protected Bitmap doInBackground(byte[]...picturedata) {
try{
//Bitmap image=BitmapFactory.decodeByteArray(picturedata,0,newbytestoread);
Bitmap image=BitmapFactory.decodeByteArray(picturedata[0],0,newbytestoread);
ByteArrayOutputStream output_stream = new ByteArrayOutputStream();
output_stream.flush();
//image.compress(CompressFormat.PNG, 85, output_stream);
output_stream.close();
return image;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
protected void onPostExecute(Bitmap b){
imview.setImageBitmap(b);
imview.invalidate();
Log.d(TAG,"All Done");
}
}
}
我从 pi 获得了正确的图像帧长度,似乎我也在获得图像数据,但 imageview 不显示任何内容。日志如下:
Image Length : 6029
Image array created
D/skia: --- Failed to create image decoder with message 'unimplemented'
D/skia: --- Failed to create image decoder with message 'unimplemented'
D/MainActivity: All Done
D/MainActivity: All Done
D/MainActivity: Image data: ����VExif����MM��*�������
�������������������������������x�����������������������
�������������������������������������(��������������2������������������������������i�����������������������RaspberryPi��RP_ov5647��������H������������H������2020:01:01 17:48:03��������������0220�������������&�������������:����������������������0100����������������������������������������������x��������2020:01:01 17:48:03��2020:01:01 17:48:03���������������x���"�������������������������
������}��!1AQa"q2��#B��R��$3br�
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���������������������������������������������������������������������������������������
����w��!1AQaq"2B���� #3R�br�
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������������������������������������������������������������������������������?�����gB1��3����3�q ry�����v�O`Fpw�9����V��v�����r �����I班ssH��c�¹�'$��dt�b�GM[En��/=n~˝be̥ϯ�z~�K���ur{�N ��`���s�g����OB[<���R:��8�ғ�6�W�Ry��s���E�H�o�l�ƽ:q�zi{n��{���Uw*��z7���]|��w&��~��c<�ۯ ^����g���^2��@���Fs�y���3��Nz1�cߎ���zm�A0�py�9�z�667�%o]{5n�w�E����gE��>�ٺum�{��5l��������uϮ{b���F1�2@���z���X����rI�=:��O�5h\es���|������Iђ����v�}4?���q^��w\�k����/���ψ��� #��'���}��u <ɟ�������9秣k���=����x�^zu�+�-#�V��ۏ���^�Y�]����~^���s��ܱRZ���n�W�e���ׯ�b͑�{���w�1�P��;��;p���A�5i���9<1����Ny�מ���)�z`�:��z�A��g��������b��k���V0d66�3��y����=�z�v|� N:���c�欐r���r:s�u�\�`b� ������s�?C�����[~'�YJ���OO]��9�߰9�p3��ӌ@N{c�9���ǧl�튱 ����������9�*<�9�����;�+e���G�[������dtR�����_���%3�[�o�~�t������?�0h��q��~� �������4o�8�Pa'���[vF�e�m ���D��A��yk����8��|����� q]=�I=�����FFB��8�~^����I�G'��u����Ex�e�u��ϡ�Ny-.��������k�yY���0G<��3�{����s�x= �;c?�x0y�K���<�}zg��u��*���#�d����z�}���{菃�6�U�Km�^��rE9 ��ۜg��<�+��nz�8�#��OnG�z�����A#9�������c8Ҵ�i��6#=FON����8W�4d��yn�g���C �ܼ�j�^��Mm��[{Áׁ�O\�9��{g���}�F@ c��{�θ�nq���p1��==�-�<:s�=~�x��ڼ)���m����?Y��/�^���+˿O�cKS�VC�y����8\��\��lz���Y���[�ӂ����}��} �9����9�=O85ل�ȟ����ۼ�3�x�^QWO�������q�����u?��A���
I am here
Image Length : 6092
Image array created
D/skia: --- Failed to create image decoder with message 'unimplemented'
我在网络和 Java 方面的经验有限,我不确定这里出了什么问题。有人可以帮忙吗?