
最近,使用了javaCV的ffmpeg包的FFmpegFrameGrabber帧抓取器来播放同步的音频和视频帧. 使用的同步方法是视频到音频的同步.
具体思路如下:
(1)首先介绍ffmpeg如何捕获视频文件的图像和声音.
FFmpegFrameGrabberfg = newFFmpegFrameGrabber(“ avideofilepathoraurl);

在获取帧捕获器对象之后,调用其handle()方法将返回捕获的Frame对象. 该帧可以是视频帧或音频帧. 当然,捕获的帧将被解码并存储在java.nio.Buffer对象中. 对于视频帧,缓冲区用于存储图像的像素数据(例如RGB),然后传递
BufferedImagebi =(newJava2DFrameConverter()). getBufferedImage(f);
您可以获取图片. 所获得的图片可以进行一系列处理,也可以不经处理直接显示在摇摆组件上. 对应于音频帧,缓冲器存储音频的PCM数据. 此PCM可以是浮动的或短路的. 然后使用java.sounds.sample中的sourceDataLine.write方法将这些音频PCM数据写入扬声器.
(2)然后,我们将介绍如何连续播放获得的帧. 第一种是单独播放视频:

while(true){Framef = fg.grab();如果(f.image!= null)label.setIcon(newImageIcon((newJava2DFrameConverter()). getBufferedImage(f))); Thread.sleep(1000 /视频帧速率);}
类似地,分别播放音频,只需将数据写入声卡即可. 例子
(3)生产消费者模型.

上图是使用生产者模式确定捕获的帧的程序实现方法. 如果是视频帧,则将其生成到视频FIFO中. 如果是音频帧,则将其生成到音频FIFO中. 然后,音频播放线程和视频播放线程会消耗其各自帧存储库中的帧. 使用生产消费者模式的原因是视频播放器java版,帧捕获的速度快于帧的消耗,因此我们首先捕获帧以进行缓冲,或者进一步预处理捕获的帧,而视频和音频回放线程仅需要处理已处理的帧可以直接播放.
(4)音频和视频同步的方法: 播放两帧音频中的所有视频帧.
如果要实现音频和视频同步,则必须具有帧的时间戳. 这里捕获的帧只是回放时间戳PTS,没有解码时间戳DTS,因此我们只需要根据回放时间戳确定回放即可.

该程序的执行基于上图. 当音频线程开始播放音频帧A1时,它将调用视频线程的setRun方法视频播放器java版,并传递当前音频帧时间戳curTime和下一个音频帧A2. 将时间戳nextTime分配给处于等待状态的视频线程,然后视频线程启动,开始从视频FIFO中获取视频帧G1,然后计算G1和A1之间的时间差作为回放延迟. 在Thread.sleep(t1)之后,视频线程仅在图像组件上显示图像,例如JLabel.setIcon(图像). 然后视频线程拍摄图像G2的另一帧,并将G2的时间戳与A2的时间戳进行比较. 如果G2时间戳小于A2,则视频线程继续延迟t2,然后播放G2图像,然后G3进行相同操作,直到获得G4. 与A2相比,发现G4时间戳大于A2,则视频线程进入等待状态并等待下一次开始. 然后,在音频线程完成播放A1音频帧之后,它将音频帧A3从仓库中取出,然后将A2的时间戳记和A3的时间戳记传递给视频线程,然后开始播放A2,然后播放被阻止的视频线程继续以相同的方式播放.
(5)动态调整延迟时间
由于个人PC不是实时操作系统,也就是说,Thread.sleep是不准确的,并且受声卡播放的声音的限制,因此需要改进上述基本实现思想. 首先,java的sourceDataLine方法是按照一定的速度从内部缓冲区中取出音频线程写入的数据. 如果将音频写入的数据取出,则音频播放将冻结,但是如果音频数据写入一次,太多,则音频和视频可能不同步,因此请确保sourceDataLine的内部缓冲区为剩下的数据量一定,否则会造成结结,但数据量不应太大,因此我们在到达G3到A2的这段时间内用来调整声音播放. 由于延迟的不准确性,可能会在时间t6之前将声卡取出A1帧中写入的数据,因此在播放G3图像后,声线将根据返回的数据量进行判断. sourceDataLine.available(). 如果数据量几乎完成,则将延迟时间t4从G3减少到A2. 这样,可以保证数据量不会变为0并导致声音冻结.
(6)以下是该程序在Windows64和ubuntu14下的测试结果: 播放流畅,也可以进行同步.
源下载地址为;
请参阅jar包以添加响应
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-154370-1.html
从我做起
做点实事
那就让女性无偿服务呀
不一个档次