Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Broadcasting Android Camera Video

What I want is to broadcast an android camera video to remote locations, for anyone to watch that video on their mobile or website. I've been succesful to unicast it to the vlc player on my pc. I tried red5 server, Adobe media server, ffmpeg server but all in vail. Each of them was only able to broadcast video from a prerecorded file but not from any live stream. Can any one suggest me what i do.

like image 245
Yahya Arshad Avatar asked May 23 '12 04:05

Yahya Arshad


1 Answers

I read (I think it was even on stackoverflow) that you can provide the MediaRecorder with a FileHandle of a TCP-Connection. Then you can listen to that connection, read the data, packetize it and resend it as a RTSP/RTP-Stream.

If I happen to find the original post, I'll reference it here.

EDIT:

The original Post was: Streaming Video From Android

And the part about the Filedescriptor is from: http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system

Just in case, I cite the according example from the blog:

String hostname = "your.host.name"; 
int port = 1234; 
Socket socket = new Socket(InetAddress.getByName(hostname), port);
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
MediaRecorder recorder = new MediaRecorder(); // Additional MediaRecorder setup (output format ... etc.) omitted 
recorder.setOutputFile(pfd.getFileDescriptor());
recorder.prepare();
recorder.start();

However this only sends the Video File Data over the wire. You can save it and then play it back. But as mentioned, it is not a stream, yet.

UPDATE: You do not even have to use a TCP Socket for the first step. I just tripped over "LocalSocket"(1), that also gets you a FileHandle to feed the MediaRecorder. Those Local sockets are "AF_LOCAL/UNIX domain stream socket"s. See http://developer.android.com/reference/android/net/LocalSocket.html

I have not tried all the above myself as of today, but will pretty soon. So maybe I can be of more help in the near future :)

(1) LocalSocket is not usable on newer Android versions for security reasons! See Update from 2015-11-25.

UPDATE 2: Just saw in the Android Sources the "OUTPUT_FORMAT_RTP_AVP". But it is hidden :( So I guess it will be available in future API versions of Android. https://github.com/android/platform_frameworks_base/blob/master/media/java/android/media/MediaRecorder.java Line 219:

public static final int OUTPUT_FORMAT_RTP_AVP = 7;

I have not tried just tricking the hide by providing a hardcoded 7 ... If anybody does, please leave a comment here!

UPDATE 2015-11-25

I just ran into libstreaming: https://github.com/fyhertz/libstreaming I did not look into it too deeply, but it seems there is a lot to be learned about streaming from Android from this project (if not only using it). I read there that the LocalSocket solution is invalid for newer Android versions :( But they present an alternative: ParcelFileDescriptor.

like image 91
Fildor Avatar answered Nov 15 '22 18:11

Fildor