3

我已经看到很多使用 Android 的 VideoVIew API 将数据从外部服务器流式传输到设备的示例(VideoView 在内部使用 RTP 和 RTSP 堆栈来接收数据)。然而,很少有关于使用 Android 内部 RTSP 和 RTP 堆栈来实现服务器功能的可能性的讨论,即使 android 设备充当流服务器并流媒体输出。可能吗 ?我可以在 Android 原生代码中的什么地方开始挖掘来实现这样的功能?将不胜感激细节。

谢谢阿米特

4

2 回答 2

2

有点晚了,但是:

您可以将 MediaRecorder 输出格式设置为“7”。这是定义在

/framework/base/media/java/android/media/MediaRecorder.java

检查以获取详细信息

作为:

/** @hide Stream over a socket, limited to a single stream */
 public static final int OUTPUT_FORMAT_RTP_AVP = 7;

目的地可通过 setprop streaming.ip 和 setprop streaming.port 控制

然后 AV 数据将流式传输到给定的目标地址。

RTP 代码(本机)本身存在于

/frameworks/base/media/libstagefright/rtsp directory.

快乐的代码挖掘

于 2013-01-30T12:45:13.647 回答
1

还有可能使用 libstreaming 库(https://github.com/fyhertz/libstreaming

Github 上的文档为您提供了如何设置服务器的示例,但基本上您需要将 net.majorkernelpanic.streaming.gl.SurfaceView 添加到您的 Layout

<net.majorkernelpanic.streaming.gl.SurfaceView
    android:id="@+id/surface"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/> 

将此添加到您的清单中

<service android:name="net.majorkernelpanic.streaming.rtsp.RtspServer"/>

包括 libstreaming 库。如果您使用的是较新版本的 Android Studio,则需要将 libstreaming 克隆为单独的项目并导入模块。之后,需要在 libstreaming 中的 build.gradle 上运行 build。然后你就可以使用这个库了。

最后一步是创建一个活动。最简单的可能看起来像这样:

public class RemoteStreamingActivity extends Activity {
    private SurfaceView mSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_remote_streaming);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        handleGestures();
        mSurfaceView = (SurfaceView) findViewById(R.id.surface);

        SessionBuilder.getInstance()
            .setSurfaceView(mSurfaceView)
            .setPreviewOrientation(90)
            .setContext(getApplicationContext())
            .setAudioEncoder(SessionBuilder.AUDIO_NONE)
            .setVideoEncoder(SessionBuilder.VIDEO_H264);

        this.startService(new Intent(this,RtspServer.class));
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.stopService(new Intent(this, RtspServer.class));
    }
}

如果您想测试 rstp 服务器是否正在运行,您可以尝试使用 VLC 并通过 URL 连接:rstp://{ipAddressOfYourDevice}:8086?h264=200-20-320-240

于 2016-11-02T15:21:05.523 回答