问题描述
我想使用 Java CV 创建一个媒体播放器,但我无法调整帧速率 正因为如此,有些视频播放速度快,有些播放慢
是否可以通过一个FFmpegFrameGrraber对象读取一个视频的信息并将其设置在另一个对象中来解决问题? 当然,我这样做并没有得到答案,但如果有其他方法,请帮助
playThread = new Thread(new Runnable() {
public void run() {
try {
final String videoFilename = "E:\\Java\\s1\\3.mp4";
final String videoFilename2 = "E:AudioVideo.mp4";
final String videoFilename3 = "E:\\1.mp4";
final String videoFilename4 = "E:\\Java\\s1\\3.mp4";
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoFilename);
grabber.start();
grabber.setFrameRate(30.00);
primaryStage.setWidth(grabber.getimageWidth());
primaryStage.setHeight(grabber.getimageHeight());
final AudioFormat audioFormat = new AudioFormat(grabber.getSampleRate(),16,grabber.getAudioChannels(),true,true);
final DataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat);
final SourceDataLine soundLine = (SourceDataLine) AudioSystem.getLine(info);
soundLine.open(audioFormat);
soundLine.start();
JavaFXFrameConverter converter = new JavaFXFrameConverter();
ExecutorService executor = Executors.newSingleThreadExecutor();
while (!Thread.interrupted()) {
Frame frame = grabber.grab();
if (frame == null) {
break;
}
if (frame.image != null) {
final Image image = converter.convert(frame);//
Platform.runLater(() -> {
imageView.setimage(image);
});
}
else if (frame.samples != null) {
final ShortBuffer channelSamplesShortBuffer = (ShortBuffer) frame.samples[0];
channelSamplesShortBuffer.rewind();
final ByteBuffer outBuffer = ByteBuffer.allocate(channelSamplesShortBuffer.capacity() * 2);
for (int i = 0; i < channelSamplesShortBuffer.capacity(); i++) {
short val = channelSamplesShortBuffer.get(i);
outBuffer.putShort(val);
}
try {
executor.execute(() -> {
soundLine.write(outBuffer.array(),outBuffer.capacity());
outBuffer.clear();
});
} catch (Exception interruptedException) {
Thread.currentThread().interrupt();
}
}
}
executor.shutdownNow();
executor.awaitTermination(10,TimeUnit.SECONDS);
soundLine.stop();
grabber.stop();
grabber.release();
Platform.exit();
} catch (Exception exception) {
LOG.log(Level.SEVERE,null,exception);
System.exit(1);
}
}
});
playThread.start();
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)