我正试图将直播视频从我的Android流式传输到我的PC(这将对输入进行沉重的OpenCV操作并将结果保存到文件中),两者都在同一局域网中。我已经尝试过使用libstreaming来达到这个目的,但问题是我无法使用它来发送分辨率高于240x160的帧,这给了我很差的质量——不足以满足我的需求。我使用过H264,当我尝试使用更高的分辨率时,libstreaming抛出一个异常,编码器无法处理这些帧。
关于我如何使用libstreaming来流式传输高分辨率帧的任何想法?(最好是720p, 20+ fps)。不使用libstreaming的想法也欢迎…
谢谢!
嗯,你可以在FFMPEG的帮助下做一个本地C/c++ RTP或RTSP流媒体。你可以使用API制作自己的软件,或者如果你的Android环境允许的话,甚至可以从命令行运行FFMPEG。您没有提到可用的选择(仅Java, Java + JNI + C/c++),因此很难给出确切的建议。
我目前有同样的问题。然而,我设法得到一些更好的结果与libstreaming使用H263编解码器。视频质量仍然不是完全令人满意,但它是720p。我基于libstreaming示例1构建了我的应用程序,使用RTSPServer
。以下是相关代码:
private Session mSession;
[...]
mSession = SessionBuilder.getInstance()
.setContext(getApplicationContext())
.setAudioEncoder(SessionBuilder.AUDIO_AAC)
.setAudioQuality(new AudioQuality(8000, 16000))
.setVideoEncoder(SessionBuilder.VIDEO_H263)
.setVideoQuality(new VideoQuality(1280,720,30,2000000))
.setSurfaceView(mSurfaceView)
.build();
我不知道如何使用openCV处理流,但例如,我可以使用VLC看到它:
C:>"C:<your VLC installation path>vlc.exe" rtsp://<your device IP address>:1234 -f
编辑:我设法在720p使用H264编码器流,并强迫MediaRecorder
方法而不是MediaCodec
一个。不太确定为什么第二种比第一种更可取或更先进。质量或多或少与我上面描述的方法相同,但至少当你快速移动时发生的抖动消失了。
注意,使用SessionBuilder
强制流方法不起作用:
mSession = SessionBuilder.getInstance()
.setContext(getApplicationContext())
.setAudioEncoder(SessionBuilder.AUDIO_AAC)
.setAudioQuality(new AudioQuality(8000, 16000))
.setVideoEncoder(SessionBuilder.VIDEO_H264)
.setVideoQuality(new VideoQuality(1280,720,30,2000000))
.setSurfaceView(mSurfaceView)
.setStreamingMethod(VideoStream.MODE_MEDIARECORDER_API) //Completely ignored
.build();
你必须强制它在调用url:
C:>"C:<your VLC installation path>vlc.exe" rtsp://<your device IP address>:1234?videoapi=mr -f