如何在没有任何外部API的情况下用Java处理视频?
我有一个mpeg4或mpeg2视频,我想在JPanel
中观看,一个接一个地读取每一帧,然后用paintComponent()
显示这些帧。在Graphics g
中将每个文件显示为BufferedImage
。
我的问题是如何从视频文件中获得BufferedImage
类的数组?
您当然可以在不依赖外部库的情况下处理Java中的视频。这将需要你相当多的编码工作,所以要提前警告。
如果你正在解码一个MPEG-2文件,那可能是一个程序流,所以你需要编写代码来分解它。MPEG-4第2部分的视频可能会到达一个MP4容器,这将需要大量的代码来分解(不太难,只是很多细节)。所以这只是一个容器;里面将是大块的压缩视频和音频。
现在,您需要解码MPEG-2或MPEG-4视频。这将需要从比特流中解析可变长度代码并恢复语法元素。对于内部帧,这将为您提供应用于宏块流的重建数据。为了恢复原始图像,您将结合DCT系数、差分编码、去量化因子、锯齿形扫描模式、离散余弦变换以及可能的后处理滤波器。这只是针对帧内;则存在还应用运动矢量并从先前解码的帧复制数据的帧间。
在得到一个帧之后,你会发现它是在YUV颜色空间中。您可能需要手动将其转换为RGB颜色空间,以便将其绘制到BufferedImage上。
完全有可能您可以自己实现所有这些或者您可以找到合适的Java-friendly多媒体库,并配有自己的API,为您完成繁重的任务。