来自TextureView

时间:2017-09-27 15:06:41

标签: java android vlc libvlc

我正在尝试从Android中使用LibVLC播放的视频中检索一个帧。作为参考,这就是我开始使用LibVLC的方法。 ffmpegSv是一个TextureView

public void startMediaPlayer() {
        ArrayList<String> options = new ArrayList<>();
        options.add("--no-drop-late-frames");
        options.add("--no-skip-frames");
        options.add("-vvv");
        options.add("--no-osd");
        options.add("--rtsp-tcp");
        options.add("--no-snapshot-preview");
        options.add("--no-video-title");
        options.add("--no-spu");
        videoVlc = new LibVLC(getActivity(), options);

        TextureView surfaceView = (TextureView) getActivity().findViewById(R.id.streamView);

        newVideoMediaPlayer = new org.videolan.libvlc.MediaPlayer(videoVlc);
        final IVLCVout vOut = newVideoMediaPlayer.getVLCVout();
        vOut.setVideoSurface(ffmpegSv.getSurfaceTexture());
        vOut.setWindowSize(ffmpegSv.getWidth(), ffmpegSv.getHeight());
        vOut.attachViews();

        Media videoMedia = new Media (videoVlc, Uri.parse("rtsp://1.1.1.1/abc.mov"));
        newVideoMediaPlayer.setMedia(videoMedia);
        newVideoMediaPlayer.play();
    }

这就是我试图从中获取位图的方式。我应该注意这个方法在使用android MediaPlayer时工作正常。

@Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        if (mStream != null) {
            if (idx++ % 10 == 0) {
                (new Runnable() {
                    @Override
                    public void run() {
                        FileOutputStream out = null;
                        Bitmap b = ffmpegSv.getBitmap(ffmpegSv.getWidth(), ffmpegSv.getHeight());
                        Bitmap bm = Bitmap.createScaledBitmap(b2, 640, 480, true);
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                        bm.compress(Bitmap.CompressFormat.JPEG, 50, bos);
                        byte[] arr = bos.toByteArray();
                        mStream.onJpegFrame(arr, 0L);
                        b.recycle();
                        bm.recycle();
                    }
                }).run();
                idx = 0;
            }
        }
    }

但是,正在生成的图像边缘的TextureView周围的原始图像的条子几乎像边框一样,但图像的其余部分被黑框遮盖。

我唯一能想到的是VLC使用某种叠加的字幕等,当使用getBitmap()拉出它时会失去透明度。但是,我并非100%确定是这种情况。有没有办法检查是否是这种情况,或禁用VLC可能添加的任何类型的叠加?

编辑:我添加了一个示例图片来演示问题:

enter image description here

你可以看出背景图像的底部,右侧和顶部以及顶部的清晰矩形。

1 个答案:

答案 0 :(得分:0)

Bitmap b = ffmpegSv.getBitmap(ffmpegSv.getWidth(), ffmpegSv.getHeight());
Bitmap bm = Bitmap.createScaledBitmap(b2, 640, 480, true);

您不是在这里扩展其他内容吗? 什么是b2?