顺序显示位图,"像视频"

时间:2012-12-14 17:14:10

标签: android bitmap ffmpeg

我正在尝试在我的应用中重现一个不支持Android的视频(如.wmv视频),实际上我可以抓住每一帧并创建一个Bitmap。

所以,现在,我正试图在VideoView(或任何其他视图)中显示这些位图,顺序显示像视频一样。

一些代码:

while (true) {
                frame = frameGrabber.grab();
                if (frame == null)
                    break;
                frame2 =
                        IplImage.create(frame.width(), frame.height(),
                                opencv_core.IPL_DEPTH_8U, 4);
                opencv_imgproc.cvCvtColor(frame, frame2,
                        opencv_imgproc.CV_BGR2RGBA);

                bm =
                        Bitmap.createBitmap(frame2.width(),
                                frame2.height(), Bitmap.Config.ARGB_8888);
                bm.copyPixelsFromBuffer(frame2.getByteBuffer());
                canvas = new Canvas(bm);
                mVideoView.draw(canvas);
                canvas.save();

看起来我可以抓住视频的每一帧(使用ffmpeg),但我只是不知道如何显示它们。

顺便说一句,我已经尝试将此视频编码为.mp4文件并在VideoView上播放,但处理整个视频需要花费很多时间(1小时),所以,现在,我正在尝试立即显示它,不编码它.mp4(或任何其他Android支持的视频)

有任何建议吗?

3 个答案:

答案 0 :(得分:1)

您可以使用AnimationDrawable。它会起作用。

一点点文档here

答案 1 :(得分:1)

您可以使用FFplay实时播放图像序列。您不需要先将其编码为视频文件。

假设您的文件名为image1.bmp,image2.bmp,image3.bmp ...等,并且您希望以每秒30帧的速度播放它们,请尝试:

ffplay -framerate 30 -i image%d.bmp

答案 2 :(得分:0)

我不确定你的问题是什么。

现在您的画布已填充(假设它已正确填充),您可以通过调用其draw(Canvas)方法在SurfaceView上绘制它。

我对结果感到好奇,因为如果你需要花费很多时间对完整的视频进行编码,那么这可能意味着你的编码很长,所以你可能会遇到严重的帧率问题(或者视频可能非常长?)。