Stream live video from phone to phone using socket fd

I am new to android programming and have found myself stuck I have been researching various ways to stream live video from phone to phone and seem to have it mostly functional, except of course the most important part: playing the stream. It appears to be sending the stream from one phone, but the second phone is not able to play the stream.

Here is the code for the playing side

  • Cannot create files on Android with Xamarin
  • Android New Intent start particular method
  • Push notification works incorrectly when app is on background or not running
  • SharedPreferences are not being cleared when I uninstall
  • Android Studio does not compile when using deprecated API
  • Generating UML diagram in Android Studio
  • public class VideoPlayback extends Activity implements Callback {
    MediaPlayer mp;
    private SurfaceView mPreview;
    private SurfaceHolder holder;
    private TextView mTextview;
    public static final int SERVERPORT = 6775;
    public static String SERVERIP="192.168.1.126";
    Socket clientSocket;
    private Handler handler = new Handler();
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mPreview = (SurfaceView) findViewById(R.id.surfaceView1);
        mTextview = (TextView) findViewById(R.id.textView1);
        holder = mPreview.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mTextview.setText("Attempting to connect");
        mp = new MediaPlayer();
        Thread t = new Thread(){
            public void run(){
                try {
                        clientSocket = new Socket(SERVERIP,SERVERPORT);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            mTextview.setText("Connected to server");
                        }
                    });
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(clientSocket);
                                pfd.getFileDescriptor().sync();
                                mp.setDataSource(pfd.getFileDescriptor());
                                pfd.close();
                                mp.setDisplay(holder);
                                mp.prepareAsync();
                                mp.start();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
    
                        }
                    });
    
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        t.start();
    }
    

    And here is the code for the streaming side

    public class VideoStreaming extends Activity{
    // User Interface Elements
    VideoView mView;
    TextView connectionStatus;
    SurfaceHolder mHolder;
    // Video variable
    MediaRecorder recorder; 
    // Networking variables
    public static String SERVERIP="";
    public static final int SERVERPORT = 6775;
    private Handler handler = new Handler();
    private ServerSocket serverSocket;  
    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // Define UI elements
        mView = (VideoView) findViewById(R.id.video_preview);
        connectionStatus = (TextView) findViewById(R.id.connection_status_textview);
        mHolder = mView.getHolder();
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        SERVERIP = "192.168.1.126";
        // Run new thread to handle socket communications
        Thread sendVideo = new Thread(new SendVideoThread());
        sendVideo.start();
    }
     public class SendVideoThread implements Runnable{
        public void run(){
            // From Server.java
            try {
                if(SERVERIP!=null){
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            connectionStatus.setText("Listening on IP: " + SERVERIP);
                        }
                    });
                    serverSocket = new ServerSocket(SERVERPORT);
                    while(true) {
                        //listen for incoming clients
                        Socket client = serverSocket.accept();
                        handler.post(new Runnable(){
                            @Override
                            public void run(){
                                connectionStatus.setText("Connected.");
                            }
                        });
                        try{
                                // Begin video communication
                                final ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(client);
                                handler.post(new Runnable(){
                                    @Override
                                    public void run(){
                                        recorder = new MediaRecorder();
                                        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                                        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);                 
                                        recorder.setOutputFile(pfd.getFileDescriptor());
                                        recorder.setVideoFrameRate(20);
                                        recorder.setVideoSize(176,144);
                                        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
                                        recorder.setPreviewDisplay(mHolder.getSurface());
                                        try {
                                            recorder.prepare();
                                        } catch (IllegalStateException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        } catch (IOException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
                                        recorder.start();
                                    }
                                });
                        } catch (Exception e) {
                            handler.post(new Runnable(){
                                @Override
                                public void run(){
                                    connectionStatus.setText("Oops.Connection interrupted. Please reconnect your phones.");
                                }
                            });
                            e.printStackTrace();
                        }
                    }
                } else {
                    handler.post(new Runnable() {
                        @Override
                        public void run(){
                            connectionStatus.setText("Couldn't detect internet connection.");
                        }
                    });
                }
            } catch (Exception e){
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        connectionStatus.setText("Error");
                    }
                });
                e.printStackTrace();
            }
            // End from server.java
        }
    }
    

    I receive the following error when trying to create the MediaPLayer

    05-24 16:25:39.360: ERROR/MediaPlayerService(88): offset error
    05-24 16:25:39.360: ERROR/MediaPlayer(11895): Unable to to create media player
    05-24 16:25:39.360: WARN/System.err(11895): java.io.IOException: setDataSourceFD failed.: status=0x80000000
    05-24 16:25:39.360: WARN/System.err(11895):     at android.media.MediaPlayer.setDataSource(Native Method)
    05-24 16:25:39.360: WARN/System.err(11895):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:811)
    05-24 16:25:39.360: WARN/System.err(11895):     at com.conti.VideoPlayBack.VideoPlayback$1$2.run(VideoPlayback.java:63)
    05-24 16:25:39.360: WARN/System.err(11895):     at android.os.Handler.handleCallback(Handler.java:587)
    05-24 16:25:39.360: WARN/System.err(11895):     at android.os.Handler.dispatchMessage(Handler.java:92)
    05-24 16:25:39.360: WARN/System.err(11895):     at android.os.Looper.loop(Looper.java:132)
    05-24 16:25:39.360: WARN/System.err(11895):     at android.app.ActivityThread.main(ActivityThread.java:4025)
    05-24 16:25:39.360: WARN/System.err(11895):     at java.lang.reflect.Method.invokeNative(Native Method)
    05-24 16:25:39.360: WARN/System.err(11895):     at java.lang.reflect.Method.invoke(Method.java:491)
    05-24 16:25:39.360: WARN/System.err(11895):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    05-24 16:25:39.360: WARN/System.err(11895):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    05-24 16:25:39.360: WARN/System.err(11895):     at dalvik.system.NativeStart.main(Native Method)
    

    Does anyone have a fix for this? Thanks in advance!

  • How to change default images of CheckBox
  • Android Save images to SQLite or SDCard or memory
  • How can I properly connect an Android application to an RFCOMM socket on a Bluetooth enabled Arduino microcontroller?
  • Android - How to create a transition from an item in listview to a whole activity?
  • Speed up Android project build time in IntelliJ IDEA
  • SwiperefreshLayout in Android
  • 4 Solutions collect form web for “Stream live video from phone to phone using socket fd”

    I found an open source project for implementing what I was trying. It processes the video with metadata through an IP camera. Although it does not send video directly to a phone, it does broadcast video for various devices to watch. The source code can be found at the following project page http://code.google.com/p/ipcamera-for-android/.

    With Android 4.4 there is another way to play a live MJPEG stream. The stream you are playing should be broadcast by the other device on a port over UDP. Let’s say we have a stream being broadcast on 192.168.0.101:8080. We can play the stream by adding a WebView to our layout. Then in our activity we do the following:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mjpeg_activity);
        // Grab instance of WebView
        WebView webView = (WebView)findViewById(R.id.webViewStream);
        // Set page content for webview
        webView.loadData("<html><head><meta name='viewport' content='target-densitydpi=device-dpi,initial-scale=1,minimum-scale=1,user-scalable=yes'/></head><body><center><img src=\"http://192.168.0.101:8080/\" alt=\"Stream\" align=\"middle\"></center></body></html>", "text/html", null);
        webView.getSettings().setBuiltInZoomControls(true);
    }
    

    In the content we tell the webpage to use the device’s dpi. To support the user to pinch zoom on the webpage I have added the following initial-scale=1,minimum-scale=1,user-scalable=yes. Initially the image is it’s original size and cannot get smaller. The user can now scale to zoom into the image and out to it’s original size. Removing the minimum scale will give the user complete control over zoom, but can result in making the image so small you can’t find it.

    You have to set the recorder output format 8(MPEG-2TS, only available from android version 3.0+).
    In this case record the video in this format and sent stream to other phone and save it in a file. And play it after writing some data in the file, then you can see live stream.

    Note- You can’t directly play through socket file descriptor, because socket fd is not seekable. If you use socket fd you will get “offset error”. Recording is possible, but play is restricted.

    Take a look at Streaming to the Android MediaPlayer , which may have some helpful tips on how to do the streaming. I suspect the issue is that Android’s trying to seek in the file, but being a network socket – it can’t. Maybe some sort of disk/memory buffer that supports seeking could help?

    Download source code from: http://code.google.com/p/ipcamera-for-android/
    (https://github.com/Teaonly/android-eye)

    Build the jni first (use ndk-build with cygwin)

    I could build this project successfully

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.