b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Javacv和FFmpeg实现视频播放器的制作,并与视频和音频同步运行;

电脑杂谈  发布时间:2020-03-27 17:05:21  来源:网络整理

视频播放器java版_李宗瑞视频播放手机版下载_视频剪切合并器 手机版

最近,使用了javaCV的ffmpeg包的FFmpegFrameGrabber帧抓取器来播放同步的音频和视频帧. 使用的同步方法是视频到音频的同步.

具体思路如下:

(1)首先介绍ffmpeg如何捕获视频文件的图像和声音.

FFmpegFrameGrabberfg = newFFmpegFrameGrabber(“ avideofilepathoraurl);

视频剪切合并器 手机版_视频播放器java版_李宗瑞视频播放手机版下载

在获取帧捕获器对象之后,调用其handle()方法将返回捕获的Frame对象. 该帧可以是视频帧或音频帧. 当然,捕获的帧将被解码并存储在java.nio.Buffer对象中. 对于视频帧,缓冲区用于存储图像的像素数据(例如RGB),然后传递

BufferedImagebi =(newJava2DFrameConverter()). getBufferedImage(f);

您可以获取图片. 所获得的图片可以进行一系列处理,也可以不经处理直接显示在摇摆组件上. 对应于音频帧,缓冲器存储音频的PCM数据. 此PCM可以是浮动的或短路的. 然后使用java.sounds.sample中的sourceDataLine.write方法将这些音频PCM数据写入扬声器.

(2)然后,我们将介绍如何连续播放获得的帧. 第一种是单独播放视频:

视频剪切合并器 手机版_李宗瑞视频播放手机版下载_视频播放器java版

while(true){Framef = fg.grab();如果(f.image!= null)label.setIcon(newImageIcon((newJava2DFrameConverter()). getBufferedImage(f))); Thread.sleep(1000 /视频帧速率);}

类似地,分别播放音频,只需将数据写入声卡即可. 例子

(3)生产消费者模型.

视频剪切合并器 手机版_李宗瑞视频播放手机版下载_视频播放器java版

上图是使用生产者模式确定捕获的帧的程序实现方法. 如果是视频帧,则将其生成到视频FIFO中. 如果是音频帧,则将其生成到音频FIFO中. 然后,音频播放线程和视频播放线程会消耗其各自帧存储库中的帧. 使用生产消费者模式的原因是视频播放器java版,帧捕获的速度快于帧的消耗,因此我们首先捕获帧以进行缓冲,或者进一步预处理捕获的帧,而视频和音频回放线程仅需要处理已处理的帧可以直接播放.

(4)音频和视频同步的方法: 播放两帧音频中的所有视频帧.

如果要实现音频和视频同步,则必须具有帧的时间戳. 这里捕获的帧只是回放时间戳PTS,没有解码时间戳DTS,因此我们只需要根据回放时间戳确定回放即可.

李宗瑞视频播放手机版下载_视频播放器java版_视频剪切合并器 手机版

该程序的执行基于上图. 当音频线程开始播放音频帧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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...