我尝试将实时视频从我的Android流式传输到我的PC(这将对输入进行大量的OpenCV操作并将结果保存到文件中),两者都在同一个局域网中。我已尝试使用libstreaming用于此目的,但问题是我无法使用它来发送分辨率高于240x160的帧,这使我的质量很差 - 不足以满足我的需求。我使用过H264,当我尝试使用更高分辨率时,libstreaming会抛出一个异常,编码器无法处理这些帧。
关于如何使用libstreaming来传输高分辨率帧的任何想法? (最好是720p,20 + fps)。 不使用libstreaming的想法也欢迎......
非常感谢!
答案 0 :(得分:0)
好吧,你可以在FFMPEG的帮助下做一个原生的C / C ++ RTP或RTSP流转换器。如果您的Android环境允许,您可以使用API并制作自己的软件,甚至可以从命令行运行FFMPEG。您还没有提到您的可用选择(仅限Java,Java + JNI + C / C ++),因此很难给出确切的建议。
答案 1 :(得分:0)
我目前遇到同样的问题。但是,我使用H263编解码器进行了libstreaming设置得到了更好的结果。视频质量仍不完全令人满意,但它的720p。
我使用RTSPServer
基于libstreaming example 1构建了我的应用程序。以下是相关代码:
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
编辑:我设法使用H264编码器以720p流式传输,并强制使用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();
你必须在调用网址中强制它:
C:\>"C:\<your VLC installation path>\vlc.exe" rtsp://<your device IP address>:1234?videoapi=mr -f