2011-07-28 96 views
5

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

从我发现到目前为止,我需要使用Android的MediaRecorder与相机作为源,并指示输出到服务器。这对我来说很有意义,但我不知道如何去做。任何人都可以给我一个正确的方向?我在“http://ipcamera-for-android.googlecode.com/svn/trunk”中浏览了一个例子,但这似乎比我需要做的事情复杂得多,而且我一直无法获得它在eclipse中工作无论如何测试它。

+0

我有类似的问题,我试过使用WebRTC,但没有在智能电视工作(我的问题是Android和智能电视之间的传输),智能电视没有镀铬:( – vrbsm

回答

8

这样做并不简单,但可能。

MediaRecorder API假定输出是一个随机访问文件,这意味着,它可以为了写入mp4(或其他)文件容器而前后移动。 正如你可以在ipcamera-for-android中看到的,输出文件被定向到一个不是随机访问的套接字。 事实上,由于MediaRecorder API只会在录制完成后才会“写入”fps,sps/pps(在h264上)等等数据,所以很难分析出站流。 API将尝试回溯到流的开始处(文件头存在的地方),但是它会失败,因为流发送到套接字而不是文件。

以ipcamera为Android是一个很好的参考,如果我记得正确,在流媒体之前,它将视频记录到文件中,打开标题并从中获取所需内容,而不是开始记录到套接字并使用它从头中取出的数据来解析流。

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

下面是数据流写入到一个插座一个良好的开端: Tutorial

我希望这是有帮助的,对于分析没有好的教程,出流进行解码,因为它不是那么简单......但再一次,这是可能的一些努力。

看看这里还看到了如何将输出流引导到可发送到服务器的流: MediaRecorder Question

+0

非常有用的凹凸在正确的方向。进入这些链接。谢谢 – ajs

0

SipDroid不正是你需要的。

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

基本上它归结为以下的(简化的代码):

// 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); 
} 

RtpPacketRtpSocket类(相当简单的),并且其操作所述视频流内容的确切的代码的执行可以在找到SipDroid项目(尤其是VideoCamera.java)。