最近用javaCV的ffmpeg包的FFmpegFrameGrabber帧捕捉器对捕捉到的音频帧和视频帧做了同步的播放。采用的同步方法是视频向音频同步。
具体的思路如下:
(1)首先介绍ffmpeg是如何捕捉视频文件的图像和声音的
FFmpegFrameGrabber fg = new FFmpegFrameGrabber("a video file path or a url);
得到帧捕捉器对象后,调用它的grab()方法就会返回捕捉到的Frame对象。这个Frame可以是视频帧或者是音频帧,这是因为音视频帧时按照时间戳在播放时间先上排列的。当然捕捉到的帧都是已经译码过的,并且存储在java.nio.Buffer对象中,对于视频帧,Buffer是储存图像的像素数据比如RGB,然后通过
BufferedImage bi = (new Java2DFrameConverter()).getBufferedImage(f);
就可以得到图片,得到的图片可以进行一系列的处理或者不处理直接显示在swing组件上。对应音频帧,Buffer是储存音频的PCM数据,这个PCM可以是float或者short的,然后用java.sounds.sample里面的sourceDataLine.write方法就可以将这些音频PCM数据写入到扬声器中。
(2)接着介绍如何不断得将得到的帧播放出来。首先是单独播放视频:
while(true)
{
Frame f = fg.grab();
if(f.image!=null)
label.setIcon(new ImageIcon((new Java2DFrameConverter()).getBufferedImage(f)));
Thr