gpt4 book ai didi

java - java代码中无法截取视频截图

转载 作者:行者123 更新时间:2023-12-02 06:02:08 25 4
gpt4 key购买 nike

我使用 vlcj 编写了一个代码,旨在定期截取视频屏幕截图。当我尝试输出视频长度时,它打印 0。问题是什么?

import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;

import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;

public class ScreenShotCapture {

public static void main(String[] args){
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files\\VideoLAN\\VLC");
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
final EmbeddedMediaPlayer mediaPlayer =mediaPlayerFactory.newEmbeddedMediaPlayer();
mediaPlayer.playMedia("E:\\videos\\Avenged Sevenfold - So Far Away [Music Video].mp4");
mediaPlayer.setSnapshotDirectory("E:\\vidoes");
long length = mediaPlayer.getTime();
long interval = length / 21;
for(long i = 1;i <= length;i+= interval){
mediaPlayer.setTime(i);
mediaPlayer.saveSnapshot();
}
}
}

最佳答案

媒体长度不会立即可用,它会在媒体开始播放后一段时间(当解码器计算出长度时)变得可用。这就是 VLC 本质上的工作原理。

几乎所有事情都是异步工作的,这意味着您的代码必须基于事件,而不是仅以过程方式编写代码。

当长度发生变化时,会生成 native 事件,最终导致触发 MediaPlayerEventListener#lengthChanged 事件。当该事件触发时,对 mediaPlayer.getLength() 的调用应返回一个非零值。

下一个问题是在调用 setTime 后立即调用 saveSnapshot。同样,setTime 是异步工作的,因此您不能假设该方法返回时媒体播放器已达到所需时间。您必须等待 timeChanged 事件并检查您的时间是否已达到(实际已过)。

最后一个问题可能很重要,也可能不重要,具体取决于您的用例,即对 saveSnapshot 的调用本身是异步的,因此本质上您已经请求了快照,但尚未生成它然而。这次您需要等待 snapshotTaken 事件。仅当收到该事件时,快照才会真正保存到磁盘。

所以基本上您需要以不同的方式思考并实现基于事件的方法。

其中一个示例是生成快照的 vlcj 示例:https://github.com/caprica/vlcj/blob/vlcj-3.0.1/src/test/java/uk/co/caprica/vlcj/test/condition/ConditionTest.java

如果您不喜欢该示例,那么您可以仅通过响应您自己的 MediaPlayerEventListener 实现中的事件来实现它。

旁白:您还可以使用 VLC“场景”过滤器以可靠的方式生成快照。

关于java - java代码中无法截取视频截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22592150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com