1

我正在尝试将视频从树莓派相机流式传输到 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�������������&amp;�������������:����������������������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�%�&amp;'()*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���&lt;�}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��==�-�&lt;: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 方面的经验有限,我不确定这里出了什么问题。有人可以帮忙吗?

4

0 回答 0