【问题标题】:Creating RTP Packets from Android Camera to Send从 Android 相机创建 RTP 数据包以发送
【发布时间】:2011-11-12 01:12:01
【问题描述】:

我是 Android 和套接字编程的新手。我想创建一个将视频从设备摄像头实时传输到 PC 的 android 应用程序。我首先要做的是从 PreviewCallback 参数中获取原始视频数据并将其转换为 RTP 数据包。我只是使用 JLibRTP 来做到这一点。关于传输数据包,我认为有一些相关的类:RtpPkt、RtpSession 和 RtpSocket。

这是我的浏览代码:

DatagramSocket rtpSocket = new DatagramSocket();
DatagramSocket rtcpSocket = new new DatagramSocket();
RtpSession rtpSession = new RtpSession(rtpSocket, rtcpSocket);

public void surfaceCreated(SurfaceHolder holder) {
    try {
            camera = Camera.open();
            camera.setPreviewCallback(new PreviewCallback() {
                public void onPreviewFrame(byte[] _data, Camera _camera) {
                int height = 240;
                    try {
                        rtps.sendData(_data);
                     } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(getApplicationContext(), e.toString(),
                        Toast.LENGTH_SHORT).show();
                    }
                }
            });
            camera.setPreviewDisplay(holder);
            camera.startPreview();
    } catch (IOException e) {
            Log.d("CAMERA", e.getMessage());
    }
}

我仍然想知道我必须将地址和端口信息放在哪里。我知道上面的代码仍然需要任何大师的更正。感谢您的提前..

【问题讨论】:

    标签: android camera rtp live-streaming


    【解决方案1】:

    我不知道这个库是否包含将数据包流式传输到 pc 的东西, 但如果没有,你就有问题了,因为 android 从 3.1 版(API 级别 12)开始只支持 RTP 流。如果您的级别较低,则必须编写自己的“rtp-server”,它能够将数据包从您的设备流式传输到 pc。

    有关更多信息,请查看 sipdroid 项目。他们创建了自己的“rtp-server”:http://code.google.com/p/sipdroid/source/browse/trunk/src/org/sipdroid/sipua/ui/VideoCamera.java

    更新:

    另一种可能性是使用 ffmpeg 库中的 ffserver,但因此您必须为 android 编译库。这是一个小教程如何做到这一点以及如何使用库:How to Build FFmpeg for Android

    更新 2:

    spydroid application 是一个很好的例子,可以在没有任何外部库的情况下从 android 设备流式传输视频。

    【讨论】:

    • 是的,我知道。就我而言,我使用的 PC 只是一个普通的 RTP 服务器。我也尝试在 SipDroid 中使用 VideoCamera.java。然而,这确实是一个非常庞大的项目,所以我想知道我必须从哪里开始。有没有人让它工作?
    • 为什么 rtp 数据包不能从 android 手机发送到 PC?我尝试在 SipDroid 中使用某些类从 onPreviewFrame() 参数中的原始数据创建 RTP 数据包。对于每一帧,都会创建一个 rtp 数据包。然后通过 sipDroid 套接字将数据包发送到 PC 地址。我 PC 中的 Wireshark 可以很好地捕获传入的数据包。但是像VLC这样的播放器无法播放它们。你能解释一下出了什么问题吗?感谢您的回答。我会在了解这些概念后立即尝试。
    • 我没有在我的代码中定义任何编解码器。我应该在打包预览帧之前将它们编码成特定的编解码器吗?
    • 我认为您的库会自动执行此操作,因此您不必设置编解码器。播放器无法播放流的原因可能是播放器不知道如何以正确的格式解码流。如何将流导入 vlc 播放器?
    • 只需在 Open Stream Network 对话框中播放“rtp://@:”。端口是在创建 RTP 套接字时设置的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多