2012-09-30 68 views
0

我使用Xuggler,我已經使用了視頻文件的絕對路徑,當我在Netbeans中運行時,它完美地工作,但是當我從jar文件啓動它時,視頻不出來..這裏的代碼從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的堆棧(

+0

堆棧? 「堆棧一個月」是什麼意思?你的意思是「卡住」嗎?如果是這樣,那麼這與Java問題有什麼關係呢? –

+1

另外這個:'@SuppressWarnings(「deprecation」)'讓我擔心只是一點點*! –

+0

當您嘗試運行此操作時,是否看到任何錯誤消息? –

回答

0

幽州:

我看過一些有關編譯JAR如的getResourceAsStream ETC2,但該文件是在bin文件夾,我想用像上面的例子絕對文件..

如果你的文件位於BIN文件夾中,那麼它很可能在jar文件中,並且不能作爲文件訪問。相反,通過將其作爲相對於類文件位置的資源進行訪問應該做些什麼,並且您的代碼將具有更好的工作機會。

順便說一句,我很好奇的文件是如何在BIN文件夾時,它的路徑在上面的代碼"C:\\qssinfo\\video\\Wildlife.avi"

編輯
另一個問題:在你的JAR文件的清單設置正確以便它所依賴的視頻庫jar文件位於其類路徑上?

例如,你的JAR的清單文件中包含該行:

Class-Path: xuggle-xuggler.jar 

或類似的東西,而且是在你的jar文件的同一目錄這個jar文件(或實際上是它在用戶目錄)?

+0

我不想使用相對路徑,因爲我想頻繁更改視頻文件的來源,我的文件在這裏是「C:\ qssinfo \ video \ Wildlife.avi」我有嘗試使用掃描儀掃描儀輸入1 =新掃描儀(新文件(「C:\ example.txt」))訪問C:\ example.txt並使用abosulte路徑。並在netbean和jar文件也成功..但是,當我訪問視頻文件,我在netbean中成功,而不是當我啓動jar ..抱歉,我不擅長英語..可能會讓你迷惑高興我的作品 –

+0

@Cornelius:然後確保你沒有試圖訪問jar文件中的東西。確保你的視頻文件在磁盤上,並確保你的絕對路徑是正確的。 –

+0

是的我沒有訪問jar文件中的文件..我的文件在C:\ qssinfo \ video \ Wildlife中。AVI,我使用絕對文件來訪問它,但它不工作.. 我應該在這裏給我所有的應用程序代碼? –

相關問題