0

私は Xuggler を使用し、ビデオ ファイルに絶対パスを使用しました。Netbeans で実行すると完全に動作しますが、jar ファイルから起動すると、ビデオが出てきません..ここにコードがあります

File file = new File("C:\\qssinfo\\video\\Wildlife.avi");
decodeAndPlayVideo.PlayVideo(file);

これは DecodeAndPlayVideo クラスのコードです (xuggler から取得し、少し編集しました)

public class DecodeAndPlayVideo {
private ImageComponent mScreen;
private IStreamCoder videoCoder;
private IContainer container;

@SuppressWarnings("deprecation")
public DecodeAndPlayVideo(ImageComponent mScreen) {
    this.mScreen = mScreen;
}

@SuppressWarnings("deprecation")
public void PlayVideo(String filename) {
    if (!IVideoResampler.isSupported(
        IVideoResampler.Feature.FEATURE_COLORSPACECONVERSION)) {
        throw new RuntimeException("you must install the GPL version"
            + " of Xuggler (with IVideoResampler support) for "
            + "this demo to work");
    }

    container = IContainer.make();

    if (container.open(filename, IContainer.Type.READ, null) < 0) {
        throw new IllegalArgumentException("could not open file: " + filename);
    }

    int numStreams = container.getNumStreams();
    int videoStreamId = -1;

    for (int i = 0; i < numStreams; i++) {
        IStream stream = container.getStream(i);
        IStreamCoder coder = stream.getStreamCoder();

        if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) {
            videoStreamId = i;
            videoCoder = coder;
            break;
        }
    }

    if (videoStreamId == -1) {
        throw new RuntimeException("could not find video stream in container: "
            + filename);
    }

    if (videoCoder.open() < 0) {
        throw new RuntimeException("could not open video decoder for container: "
            + filename);
    }

    IVideoResampler resampler = null;
    if (videoCoder.getPixelType() != IPixelFormat.Type.BGR24) {
        resampler = IVideoResampler.make(videoCoder.getWidth(),
                                        videoCoder.getHeight(), IPixelFormat.Type.BGR24,
                                        videoCoder.getWidth(), videoCoder.getHeight(), videoCoder.getPixelType());
        if (resampler == null) {
            throw new RuntimeException("could not create color space "
                + "resampler for: " + filename);
        }
    }

    IPacket packet = IPacket.make();
    long firstTimestampInStream = Global.NO_PTS;
    long systemClockStartTime = 0;
    while (container.readNextPacket(packet) >= 0) {
        if (packet.getStreamIndex() == videoStreamId) {
            IVideoPicture picture = IVideoPicture.make(videoCoder.getPixelType(),
                                                    videoCoder.getWidth(), videoCoder.getHeight());

            int offset = 0;
            while (offset < packet.getSize()) {
                int bytesDecoded = videoCoder.decodeVideo(picture, packet, offset);
                if (bytesDecoded < 0) {
                    throw new RuntimeException("got error decoding video in: "
                        + filename);
                }
                offset += bytesDecoded;

                if (picture.isComplete()) {
                    IVideoPicture newPic = picture;
                    if (resampler != null) {
                        newPic = IVideoPicture.make(resampler.getOutputPixelFormat(),
                                                    picture.getWidth(), picture.getHeight());
                        if (resampler.resample(newPic, picture) < 0) {
                            throw new RuntimeException("could not resample video from: "
                                + filename);
                        }
                    }
                    if (newPic.getPixelType() != IPixelFormat.Type.BGR24) {
                        throw new RuntimeException("could not decode video"
                            + " as BGR 24 bit data in: " + filename);
                    }

                    if (firstTimestampInStream == Global.NO_PTS) {
                        firstTimestampInStream = picture.getTimeStamp();
                        systemClockStartTime = System.currentTimeMillis();
                    } else {
                        long systemClockCurrentTime = System.currentTimeMillis();
                        long millisecondsClockTimeSinceStartofVideo =
                            systemClockCurrentTime - systemClockStartTime;
                        long millisecondsStreamTimeSinceStartOfVideo =
                            (picture.getTimeStamp() - firstTimestampInStream) / 1000;
                        final long millisecondsTolerance = 50; // and we give ourselfs 50 ms of tolerance
                        final long millisecondsToSleep =
                                (millisecondsStreamTimeSinceStartOfVideo
                                    - (millisecondsClockTimeSinceStartofVideo
                                    + millisecondsTolerance));
                        if (millisecondsToSleep > 0) {
                            try {
                                Thread.sleep(millisecondsToSleep);
                            } catch (InterruptedException e) {
                                return;
                            }
                        }
                    }

                    BufferedImage javaImage = Utils.videoPictureToImage(newPic);
                    updateJavaWindow(javaImage);
                }
            }
        } else {
            do {
            } while (false);
        }

    }
    close();
}

private void updateJavaWindow(BufferedImage javaImage) {
    mScreen.setImage(javaImage);
}

public void close() {
    if (videoCoder != null) {
        videoCoder.close();
        videoCoder = null;
    }
    if (container != null) {
        container.close();
        container = null;
    }
}

助けてください、私は 1 か月分のスタックを取得しました X(

4

1 に答える 1

0

あなたは次のように述べています:

getResourceAsStream etc2などのJARのコンパイルについていくつか読んだことがありますが、ファイルはBINフォルダーにあります。上記の例のように絶対ファイルを使用したい..

ファイルが BIN フォルダーにある場合は、jar ファイル内にある可能性が高く、ファイルとしてアクセスできません。代わりに、クラス ファイルの場所に相対的なリソースとしてアクセスすることで、実行する必要があることを実行すると、コードが機能する可能性が大幅に高くなります。

余談ですが、上記のコードのパスが"C:\\qssinfo\\video\\Wildlife.avi"

別の問題を編集
: jar ファイルのマニフェストが正しく設定されているため、依存しているビデオ ライブラリ jar ファイルがそのクラスパス上にありますか?

たとえば、jar のマニフェスト ファイルに次の行が含まれていますか。

Class-Path: xuggle-xuggler.jar

または同様のもので、このjarファイルはjarファイルと同じディレクトリにありますか(または実際には、ユーザーディレクトリにありますか)?

于 2012-09-30T05:38:29.880 に答える