Java 从Android到PC/web的音频和视频流。

Java 从Android到PC/web的音频和视频流。,java,android,video,audio,streaming,Java,Android,Video,Audio,Streaming,我是最近一个Android SDK的初学者,这个项目的总体目标是创建一个非常类似于Ustream或Qik的应用程序(是的,对于初学者来说,我不知道最好的主意)。我需要流实时音频和视频到网上。将有一个视频服务器,最有可能使用Wowza,处理视频编码到正确的格式 根据我目前的发现,我需要使用android的MediaRecorder和摄像头作为源,并将输出定向到服务器。这对我来说是有道理的,但我不知道该怎么做。有人能帮我往正确的方向推吗?我浏览了一个例子,在“http://ipcamera-for-

我是最近一个Android SDK的初学者,这个项目的总体目标是创建一个非常类似于Ustream或Qik的应用程序(是的,对于初学者来说,我不知道最好的主意)。我需要流实时音频和视频到网上。将有一个视频服务器,最有可能使用Wowza,处理视频编码到正确的格式


根据我目前的发现,我需要使用android的MediaRecorder和摄像头作为源,并将输出定向到服务器。这对我来说是有道理的,但我不知道该怎么做。有人能帮我往正确的方向推吗?我浏览了一个例子,在“http://ipcamera-for-android.googlecode.com/svn/trunk“,但这似乎比我需要做的事情要复杂得多,而且我一直无法让它在eclipse中运行来测试它

这样做并不简单,但却是可能的

MediaRecorder API假定输出是一个随机访问文件,这意味着它可以来回写入mp4(或其他)文件容器。 正如您在android的ipcamera中所看到的,输出文件被定向到一个不是随机访问的套接字。 由于MediaRecorder API仅在录制完成时才会“写入”某些数据,如fps、sps/pps(在h264上)等,因此很难解析传出流。API将尝试返回到流的开头(文件头存在的地方),但它将失败,因为流被发送到套接字而不是文件

使用android的ipcamera是一个很好的参考,如果我没记错的话,在流媒体之前,它将视频记录到一个文件中,打开头部并从那里获取它需要的内容,然后,它开始记录到套接字,并使用它从头部获取的数据来解析流

为了捕获帧,您还需要对解析mp4(或您想要使用的其他文件容器)有一些基本的了解。 您可以在设备或服务器端执行此操作

以下是将流写入套接字的良好开端:

我希望这是有帮助的,因为它不是那么简单,所以没有解析和解码传出流的好教程…但是,这是可能的,需要一些努力

在这里还可以查看如何将输出流定向到可以发送到服务器的流: 正是您所需要的

它涉及到一种绕过需要文件描述符的
MediaRecorder
类限制的黑客攻击。它将MediaRecorder视频流的结果保存到本地套接字(用作一种管道),然后从另一端的该套接字重新读取(在同一应用程序中,但另一个线程),从接收到的数据中创建RTP数据包,最后将RTP数据包广播到网络(您可以根据需要在此处使用广播或单播模式)

基本上可以归结为以下内容(简化代码):


RtpPacket
RtpSocket
类的实现(相当简单),操作视频流内容的确切代码可以在SipDroid项目中找到(尤其是
VideoCamera.java
).

非常有帮助。我现在将查看这些链接。谢谢我也有类似的问题,我尝试使用WebRTC,但在智能电视中不起作用(我的问题是android和智能电视之间的传输),智能电视没有chrome:(
// Create a MediaRecorder
MediaRecorder mr = new MediaRecorder();
// (Initialize mr as usual)
// Create a LocalServerSocket
LocalServerSocket lss = new LocalServerSocket("foobar");
// Connect both end of this socket
LocalSocket sender = lss.accept();
LocalSocket receiver = new LocalSocket();
receiver.connect(new LocalSocketAddress("foobar"));
// Set the output of the MediaRecorder to the sender socket file descriptor
mr.setOutputFile(sender.getFileDescriptor());
// Start the video recording:
mr.start();
// Launch a background thread that will loop, 
// reading from the receiver socket,
// and creating a RTP packet out of read data.
RtpSocket rtpSocket = new RtpSocket();
InputStream in = receiver.getInputStream();
while(true) {
    fis.read(buffer, ...);
    // Here some data manipulation on the received buffer ...
    RtpPacket rtp = new RtpPacket(buffer, ...);
    rtpSocket.send(rtpPacket);
}