ffmpeg 能否按帧数取视频中的一帧 并将这一帧图缩放、转成可以在 web canvas 可以用的数据结构

ffmpeg 能否按帧数取视频中的一帧图片 (是视频中任意位置中的一帧,不固定为第一帧)

并将这一帧图片缩放、转成可以在 web canvas 可以显示的数据结构

读取到数据不放到本地 ,到直接读取到内存中以直接操控数据

阅读 5.6k
5 个回答

你都说了是图片。canvas 是可以使用图片的。

当然你也可以是 imageData,也就是每个点的 rgba。

到底是问ffmpeg转图片,还是canvas显示图片。ffmpeg转图片命令网上一大把,自己随便搜搜。然后用drawImage画到canvas上就好了

需求是可以实现的

  1. ffmpeg可以定位输出具体帧为图片,且这个过程是支持调整分辨率(即你所谓的缩放)的
  2. canvas加载这个图片
ffmpeg -i input.mp4 -vf "select=eq(n\,0)[p1];[p1]scale=iw/2:ih/2" -vframes 1 out.png

select 选取帧
scale 缩放为之前的一半,更多的缩放方法查看这里

canvas 没用过不知道什么格式的,png 应该能用

更新

你的需求使用 ffmpeg 命令行是不可能做到的。

javacv 可以满足你的需求。

    public static void main(String[] args) {
        try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("video.mp4")) {
            grabber.start();

            Frame inFrame;
            while ((inFrame = grabber.grab()) != null) {
                if (AVMEDIA_TYPE_VIDEO == inFrame.streamIndex) {
                    BufferedImage bufferedImage = new BufferedImage(inFrame.imageWidth, inFrame.imageHeight, BufferedImage.TYPE_3BYTE_BGR);
                    // bufferedImage 就是你需要的图片数据,可以用来处理缩放等操作
                    Java2DFrameConverter.copy(inFrame, bufferedImage);
                }
            }
        } catch (FrameGrabber.Exception e) {
            e.printStackTrace();
        }
    }

最近做了个H5播放h264和pcm实时流的情景,视频数据就是用web canvas渲染出来的。
但是js和c++/c的内存并不能通用,需要ffmpeg把这一帧的yuv或者rgba数据处理好,然后拷贝给js层。
js层调用c++可以参考一下webassembly。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题