1

Java/OpenGL アプリケーションで、かなり大きなビデオ (場合によっては UHD (4000x2000)) を再生する必要があります。これを行うためにVLCJに落ち着きました(GStreamerで十分に速くデコードできませんでした)。VLC 自体は、通常の組み込みプレーヤーを使用する場合の VLCJ と同様に、ビデオを問題なく再生します。

directplayer を使用している場合、より大きなビデオの再生が開始され、数フレーム後に停止するか、まったく開始されません (display() は引き続き呼び出されますが、常に同じフレームで!)。私にとっては、HDReady (1280x720 はまだ正常に再生されます) と FullHD (1920x1080) の間のどこかから始まります。これはPCの性能には依存しないようです。これを 5 年前のラップトップとハイエンド マシンでテストしたところ、まったく同じ結果が得られました。何か間違ったことをしている場合、または VLCJ DirectPlayer が大きなビデオを処理できない場合のアイデアはありますか?

githubの最新のVLCJでVLC 2.0.0(2.0.3と2.0.4も試しました)を使用しています。

私はオンラインでログを持っています: http://pastebin.com/UeyMrVmW

問題を再現するダイレクトプレーヤーのセットアップ方法の簡単な例を添付します。

public class VLCTestPlayer implements RenderCallback, BufferFormatCallback {

protected MediaPlayerFactory mediaPlayerFactory;

protected DirectMediaPlayer mediaPlayer;

public static void main(final String[] args) {
    NativeLibrary.addSearchPath("libvlc",
            "C:\\Program Files (x86)\\VideoLAN\\VLC");
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            VLCTestPlayer testplayer = new VLCTestPlayer(args);
        }
    });
}

private VLCTestPlayer(String[] args) {

    JFrame frame = new JFrame("vlcj Tutorial");

    mediaPlayerFactory = new MediaPlayerFactory("--no-video-title-show", "--verbose=3");

    mediaPlayer = mediaPlayerFactory.newDirectMediaPlayer(this, this);

    String videoFile = "myVideo.mp4";
    boolean started = mediaPlayer.prepareMedia(videoFile);

    if (started)
        mediaPlayer.play();
    System.out.println("Video started: " + started + " from: " + videoFile);

    frame.setLocation(100, 100);
    frame.setSize(1050, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

@Override
public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) {
    sourceWidth = sourceWidth / 1;
    sourceHeight = sourceHeight / 1;
    System.out.println("Got VideoFormat: " + sourceWidth + "x"
            + sourceHeight);
    BufferFormat format = new BufferFormat("RGBA", sourceWidth,
            sourceHeight, new int[] { sourceWidth * 4 },
            new int[] { sourceHeight });

    return format;
}

@Override
public void display(DirectMediaPlayer mediaPlayer, Memory[] nativeBuffers,
        BufferFormat bufferFormat) {

    ByteBuffer buffer = nativeBuffers[0].getByteBuffer(0,
            (int) bufferFormat.getWidth() * (int) bufferFormat.getHeight()
                    * 4);
    int pos = 4 * ((int) bufferFormat.getWidth()
            * (int) bufferFormat.getHeight() / 2 + (int) bufferFormat
            .getWidth() / 2) + 700;
    System.out.println("Got VideoFrame: " + buffer.get(pos) + ":"
            + buffer.get(pos + 1) + ":" + buffer.get(pos + 2) + ":"
            + buffer.get(pos + 3));
}
}
4

1 に答える 1

1

私はあなたのテストにもかかわらず、これはほぼ間違いなくパフォーマンスの問題だと思います.私の経験から、あなたがやっている方法で最新のシステムでもダイレクトプレーヤーでHDビデオを再生することはできません.ハードウェアアクセラレーションなしでは対処できません. . 大まかな目安として、私の生後 6 か月の i5 デスクトップは 720p ビデオをほとんど管理できません。(補足として、そこにある println ステートメントは、間違いなく問題を解決しません。1 秒間に何度も実行すると、思ったよりも時間がかかる場合があります。)

ただし、JavaFX とそれが提供するハードウェア アクセラレーション クラスを使用して、これを機能させることができるという利点があります。詳細については、こちらを参照してください。

于 2012-11-15T16:18:30.997 に答える