Amits
Amits

Reputation: 31

Possibility of a RTSP server on a android device?

I have seen lots of examples with Android's VideoVIew API being used to stream data from an external server into a device(VideoView internally uses an RTP and RTSP stack to receive data). However, there are very few discussion on possibilities of using Android's internal RTSP and RTP stacks for achieving server capabilities, i.e making an android device act as a Streaming server and stream media out . Is it possible ? And where inside the Android native code can I start digging in to achieve such functionality ? Would appreciate details .

Thanks Amit

Upvotes: 3

Views: 2179

Answers (2)

Jakub Balhar
Jakub Balhar

Reputation: 315

There is also possibility to use libstreaming library (https://github.com/fyhertz/libstreaming)

The documentation on Github gives you the example of how do you set up the server, but basically you need to add net.majorkernelpanic.streaming.gl.SurfaceView to your Layout

<net.majorkernelpanic.streaming.gl.SurfaceView
    android:id="@+id/surface"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/> 

Add this to your manifest

<service android:name="net.majorkernelpanic.streaming.rtsp.RtspServer"/>

Include libstreaming library. If you are working with a newer version of Android Studio you need to clone the libstreaming as a separate project and import module. Afterwards, it is necessary to run build on the build.gradle in libstreaming. Then you can work with this library.

The last step is to create an Activity. Simplest possible looks like this:

public class RemoteStreamingActivity extends Activity {
    private SurfaceView mSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_remote_streaming);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        handleGestures();
        mSurfaceView = (SurfaceView) findViewById(R.id.surface);

        SessionBuilder.getInstance()
            .setSurfaceView(mSurfaceView)
            .setPreviewOrientation(90)
            .setContext(getApplicationContext())
            .setAudioEncoder(SessionBuilder.AUDIO_NONE)
            .setVideoEncoder(SessionBuilder.VIDEO_H264);

        this.startService(new Intent(this,RtspServer.class));
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.stopService(new Intent(this, RtspServer.class));
    }
}

If you want to test whether the rstp server is running you can try using VLC and connect via URL: rstp://{ipAddressOfYourDevice}:8086?h264=200-20-320-240

Upvotes: 1

Nils Hesse
Nils Hesse

Reputation: 41

A bit late, but:

You can set the MediaRecorder output format to "7". This is defined in

/framework/base/media/java/android/media/MediaRecorder.java

check that for details

as:

/** @hide Stream over a socket, limited to a single stream */
 public static final int OUTPUT_FORMAT_RTP_AVP = 7;

The destination is controllable via setprop streaming.ip and setprop streaming.port

The AV data will then be streamed to the given destination address.

The RTP code (native) itself lives in the

/frameworks/base/media/libstagefright/rtsp directory.

Happy code digging

Upvotes: 2

Related Questions