【发布时间】:2018-11-10 12:18:57
【问题描述】:
我正在使用VLC-Android 在我的android 应用程序中播放H264 RTSP 直播流,以下代码成功地将流视频渲染到表面视图上:
MediaPlayer mMediaPlayer = new MediaPlayer(VLCInstance.get());
SurfaceView mSurfaceView = (SurfaceView) findViewById(R.id.player);
final IVLCVout vlcVout = Constants.mMediaPlayer.getVLCVout();
vlcVout.detachViews();
vlcVout.setVideoView(mSurfaceView);
vlcVout.setWindowSize(mSurfaceDims.getWidth(), mSurfaceDims.getHeight());
vlcVout.attachViews();
mSurfaceView.setKeepScreenOn(true);
Media media = new Media(VLCInstance.get(), Uri.parse(path));
mMediaPlayer.setMedia(media);
mMediaPlayer.play();
VLCInstance.java:
package bi.anpr.vlc;
import android.content.Context;
import android.util.Log;
import org.videolan.libvlc.LibVLC;
import org.videolan.libvlc.util.VLCUtil;
public class VLCInstance {
public final static String TAG = "VLC/Util/VLCInstance";
private static LibVLC sLibVLC = null;
/** A set of utility functions for the VLC application */
public synchronized static LibVLC get() throws IllegalStateException {
if (sLibVLC == null) {
final Context context = VLCApplication.getAppContext();
if(!VLCUtil.hasCompatibleCPU(context)) {
Log.e(TAG, VLCUtil.getErrorMsg());
throw new IllegalStateException("LibVLC initialisation failed: " + VLCUtil.getErrorMsg());
}
try{
sLibVLC = new LibVLC(context);
}catch (Throwable e){
e.printStackTrace();
}
}
return sLibVLC;
}
public static synchronized void restart(Context context) throws IllegalStateException {
if (sLibVLC != null) {
sLibVLC.release();
sLibVLC = new LibVLC(context);
}
}
}
问题是org.videolan.libvlc.MediaPlayer 在调用 play() 之后在 SurfaceView 上渲染视频,没有任何事件可以帮助您在视图上抓取当前帧,我需要在每个时间间隔获取当前帧对其进行一些图像处理。
那么在播放直播流或本地视频资源时,是否可以使用vlc-android-sdk 抓取当前帧,进入缓冲图像或OpenCV Mat?
请注意,可以通过 DirectMediaPlayer 类使用 java (desktop vlcj)。
提前致谢!!
【问题讨论】:
-
你找到解决办法了吗?
-
@AnjaniMittal 是的,我没有来自 VLC 和社区的任何帮助,我希望明天发布答案,我还在做一些测试
-
当然 thnx,但是我今天找到了一个替代方案,使用 PixelCopy 来获取表面视图的屏幕截图,它不是空白的,它工作得很好,试过了。希望这会有所帮助。
-
感谢@AnjaniMittal,请检查我的答案,我认为这比使用任何第三方工具要快得多
标签: android vlc libvlc vlc-android