ffmpeg 能否按帧数取视频中的一帧图片 (是视频中任意位置中的一帧,不固定为第一帧)
并将这一帧图片缩放、转成可以在 web canvas 可以显示的数据结构
读取到数据不放到本地 ,到直接读取到内存中以直接操控数据
ffmpeg 能否按帧数取视频中的一帧图片 (是视频中任意位置中的一帧,不固定为第一帧)
并将这一帧图片缩放、转成可以在 web 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。
5 回答1.8k 阅读
1 回答910 阅读
3 回答704 阅读
2 回答466 阅读
你都说了是图片。canvas 是可以使用图片的。
当然你也可以是 imageData,也就是每个点的 rgba。