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

标签 android android-mediaplayer mp4 android-mediarecorder

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

  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 文件?任何代码 fragment 都会非常有帮助。

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

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

谢谢!!

最佳答案

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

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

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

关于Android - 将 rtsp (h264) 流保存到 mp4 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16266102/

相关文章:

android - 从库上传图像时无法获取方向

android - 如何在 MediaPlayer 应用程序中限制/去抖搜索栏搜索事件

android - 如何使用Android MediaPlayer在毫秒范围内播放mp3文件?

html - 无法在 Firefox 中播放 .mp4 音频文件,可在 Chrome 中使用

parsing - 为什么我不能让手动修改的 MPEG-4 扩展框( block )大小工作?

video - 使用 ffmpeg 将多个 Mp4 视频重新映射为一个

Android Studio 未知键码 - 键映射不适用于字母

java - 如何在 Android 中使用复选框管理布局

java - 在屏幕的一部分的 Canvas 上绘图

java - 暂停时如何恢复 MediaPlayer