![](/img/trans.png)
[英]Why does new File(path) doesn't work when I run my application from jar?
[英]Video doesn't work when program is run from a JAR file
我使用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;
}
}
请你能帮帮我,我一个月的筹码量是X(
您声明:
我已经阅读了一些有关编译JAR的内容,例如getResourceAsStream etc2,但是该文件位于BIN文件夹中,我想使用上面示例中的Absolute文件。
如果您的文件位于BIN文件夹中,则它很可能在jar文件中, 并且不能作为file进行访问 。 而是通过将其作为相对于类文件位置的资源进行访问来执行应做的事情,您的代码将有更好的工作机会。
"C:\\\\qssinfo\\\\video\\\\Wildlife.avi"
,我很好奇文件在您上面的代码中的路径为"C:\\\\qssinfo\\\\video\\\\Wildlife.avi"
时在BIN文件夹中的方式。
编辑
另一个问题:您的jar文件的清单文件是否正确设置,以便其依赖的视频库jar文件位于其类路径中?
例如,您的jar的清单文件是否包含以下行:
Class-Path: xuggle-xuggler.jar
或类似的内容,并且此jar文件与您的jar文件位于同一目录中(或实际上位于用户目录中)吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.