我正在做一个我需要做的项目
从 IPCamera 读取输入 H.264 编码流 - 我可以通过 rtsp url 获取它,比如 rtsp://192.168.1.83:8001/
显示 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();
}
});
- 现在我想把这个流录制成一个 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/