11

我正在做一个我需要做的项目

  1. 从 IPCamera 读取输入 H.264 编码流 - 我可以通过 rtsp url 获取它,例如 rtsp://192.168.1.83:8001/

  2. 显示 IPCamera 流 - 我可以使用


final VideoView vv = (VideoView) findViewById(R.id.video_view_h264);
        MediaController mc = new MediaController(getApplicationContext());
        vv.setVideoURI(video);
        vv.setMediaController(mc);
        vv.requestFocus();
        vv.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                vv.start();
            }
        });

  1. 现在我想将此流录制到 MP4 文件中。这是我卡住的地方,我正在考虑以下选项

a) MediaRecorder - 根据我的谷歌搜索,我相信这个类的输入只能来自设备摄像头。有没有办法调整这个我可以提供来自 rtsp 流的输入?

b) MediaCodec API - 4.1 以上的 Android 发布了这个低级 API,带有 MediaExtractor 和 MediaCodec。对于此选项,我认为以下代码段中不能使用 rtsp 流

final String STREAM_URL = "rtsp://192.168.1.83:8001/";
MediaExtractor mediaExtractor = new MediaExtractor();
mediaExtractor.setDataSource(STREAM_URL); // I get an exception 04-28 18:30:18.914: E/AndroidRuntime(8140): Caused by: java.io.IOException: Failed to instantiate extractor.

c)我可以从 url 中读取并将其存储为文件。如何将此流转换为 MP4 文件?任何代码片段都会非常有帮助。

我也尝试过使用 FFMPEG,但性能太差了,我放弃了这个选项。

对上述三个选项或我可以考虑的任何其他附加选项的任何输入将不胜感激。

谢谢 !!

4

2 回答 2

1

确实MediaRecorder不支持处理直接流媒体内容。从框架的角度来看,有解析器对象MediaExtractor和编解码器对象MediaCodec,但还没有编写器抽象。

In AOSP,recordVideo是一个命令行实用程序,旨在进行简单的基于文件的录制。作为实现的一部分,将创建一个编码器并将其传递给MPEG4Writer观察到的here。您可能会重用此代码并尝试将传入流直接写入文件。

为此,您可以将流输入建模为 aMediaSource并将其直接传递给编写器。您必须metaData从流式源设置某些基本内容并将其传递给下游编写器。MediaRecorder如果您可以直接对输入源建模,则可能不需要创建新的 。

于 2013-04-30T00:39:17.390 回答
1

在这里遇到了完全相同的问题。FFmpeg 解决了这个问题,对我来说似乎非常高效,但它依赖于硬件,需要针对每个设备 cpu 的特定 arm 版本进行编译。

另一种方法 jcodec ( http://jcodec.org/ ) 但尚未弄清楚如何使用它保存 rtsp 流。它是一个纯粹的 java 库,但没有太多可用的文档。

请告诉我您是否找到了一种方法。

于 2013-06-14T15:34:32.143 回答