Android - 将rtsp(h264)流保存到mp4文件

时间:2013-04-28 18:15:53

标签: android android-mediaplayer mp4 android-mediarecorder

我正在开展一个我需要的项目

  1. 从IPCamera读取输入的H.264编码流 - 我可以通过rtsp://192.168.1.83:8001 /

  2. 等rtsp url获取此信息
  3. 显示IPCamera流 - 我可以使用


  4. 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文件中。这是我被困的地方,我正在考虑以下选项
    2. 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)我可以从网址读取并将其存储为文件。如何将此流转换为MP4文件?任何代码段都非常有用。

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

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

      谢谢!!

2 个答案:

答案 0 :(得分:1)

MediaRecorder确实不支持处理直接流内容。从框架的角度来看,有MediaExtractor中的解析器对象和MediaCodec之类的编解码器对象,但还有编写器抽象(尚未)。

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

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

答案 1 :(得分:1)

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

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

请告诉我你是否想办法。