9

我想要的是broadcast一个远程位置的安卓相机视频,任何人都可以在他们的手机或网站上观看该视频。我已经成功地unicast在我的电脑上安装了 vlc 播放器。我尝试了red5server, Adobe media server, ffmpegserver 但都无效。他们每个人都只能broadcast从预先录制的文件中录制视频,但不能从任何直播流中录制视频。任何人都可以建议我做什么。

4

1 回答 1

8

我读到(我认为它甚至在 stackoverflow 上)你可以为 MediaRecorder 提供一个 TCP-Connection 的 FileHandle。然后您可以监听该连接,读取数据,将其打包并作为 RTSP/RTP-Stream 重新发送。

如果我碰巧找到原始帖子,我会在这里引用它。

编辑:

最初的帖子是:从 Android 流式传输视频

关于 Filedescriptor 的部分来自: http: //www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system

以防万一,我引用了博客中的相应示例:

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();

但是,这仅通过线路发送视频文件数据。您可以保存它然后播放。但如前所述,它还不是流。

更新: 第一步您甚至不必使用 TCP 套接字。我刚刚被“LocalSocket”(1) 绊倒了,这也为您提供了一个 FileHandle 来提供 MediaRecorder。这些本地套接字是“AF_LOCAL/UNIX 域流套接字”。见http://developer.android.com/reference/android/net/LocalSocket.html

到目前为止,我自己还没有尝试过以上所有方法,但很快就会尝试。所以也许我可以在不久的将来提供更多帮助:)

(1)出于安全原因, LocalSocket在较新的 Android 版本上不可用!请参阅 2015 年 11 月 25 日的更新。

更新 2: 刚刚在 Android Sources 中看到了“OUTPUT_FORMAT_RTP_AVP”。但它是隐藏的 :( 所以我想它将在未来的 Android API 版本中可用 。https ://github.com/android/platform_frameworks_base/blob/master/media/java/android/media/MediaRecorder.java第 219 行:

public static final int OUTPUT_FORMAT_RTP_AVP = 7;

我没有尝试通过提供硬编码来欺骗隐藏7......如果有人这样做,请在此处发表评论!

更新 2015-11-25

我刚刚遇到了 libstreaming:https ://github.com/fyhertz/libstreaming 我没有深入研究它,但似乎有很多关于从这个项目的 Android 流式传输(如果不仅使用它) . 我在那里读到LocalSocket 解决方案对于较新的 Android 版本无效 :( 但他们提供了一个替代方案:ParcelFileDescriptor。

于 2012-06-20T13:12:18.167 回答