各位用过JMF的老兄,当播放网络上的视频文件时,会在临时文件夹中拼命的生成文件,怎么办? 它程序这么做事有道理的。不过不太明白为什么“只要那个程序没有关闭,生成的所有的临时文件都不能删除,说文件正在使用.”我蛮感兴趣的,如果不介意,是否可以让我帮忙调试一下?[email protected]如果不可以的话,把循环播放那段代码贴出来看看,是不是资源未释放什么的问题呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多谢老兄了.我已经加了你的MSN了. 我是用一个JList将所有的文件都列出来.然后用一个线程扫描,让JList的项不断往下选,选到最后了,又从头开始.这是那个扫描线程;Runnable rScan = new Runnable(){ public void run(){ while(Thread.currentThread() == tScan){ if(fileTitle == null) return; while(isContinue){ iItem++; if(iItem == fileTitle.length){ iItem = 0; } mediaList.setSelectedIndex(iItem); isContinue = false; } } System.out.println ("À뿪ɨÃèÏß³Ì"); } };这是JList事件监听处理public void valueChanged(ListSelectionEvent e){ int si; si = mediaList.getSelectedIndex(); if(si == old_si) return; old_si = si; //System.out.println ("´¥·¢Ñ¡Ôñlistʼþ,µ±Ç°Ñ¡ÔñΪ:si="+si); isContinue = false; isDraw = true; drawImg = null; stop(); tLoadMedia = null; //ɾ³ý»º´æÖеÄÎļþ; String delPath = "C:\\WINNT\\Temp\\"; File dirDel = new File(delPath); if(dirDel.isDirectory()){ String[] fileDelList = dirDel.list(); for(int di=0;di<fileDelList.length;di++){ if(fileDelList[di].endsWith(".MPG") || fileDelList[di].endsWith(".avi")){ File fileDel = new File(delPath + fileDelList[di]); if(fileDel.isFile()){ fileDel.delete(); } } } } if(tDrawImg != null){ tDrawImg.interrupt(); tDrawImg = null; } btStop.setEnabled(true); btPlay.setEnabled(false); //chosenFile = (String)mediaList.getSelectedValue(); chosenFile = filePath[si]; strUrl = strImgURL + chosenFile; //¶ÁͼƬ˵Ã÷ÎÄ×Ö; imgIntro = fileIntro[si]; txtIntro.setText(imgIntro); iItem = si; System.out.println ("selection = " + chosenFile + ",,,hasBeCancel="+this.hasBeCancel); Graphics g = panel.getGraphics(); panel.removeAll(); if(g != null){ g.setColor(new Color(245,249,236)); //g.fillRect(0,0,panel.WIDTH,panel.HEIGHT); g.fillRect(0,0,320,260); g.setColor(Color.black); g.drawString("ÕýÔÚ×°ÔضàýÌåÐÅÏ¢,ÇëÉÔºò...",50,100); } if(player != null){ player.deallocate(); player = null; } int pos = strUrl.lastIndexOf("."); String exName = strUrl.substring(pos+1); //System.out.println ("exname="+exName); if(exName.equalsIgnoreCase("jpg") || exName.equalsIgnoreCase("gif")){ //ÊÇͼƬ; panel.setBounds(0,0,320,240); panel.invalidate(); Image img = null; try{ //img = Toolkit.getDefaultToolkit().getImage("media\\"+path+"\\"+ID+"\\media\\"+chosenFile); URL url = new URL(strUrl); img = Toolkit.getDefaultToolkit().getImage(url); //System.out.println ("¼ÓÔØͼƬ³É¹¦:"+strUrl); }catch(Exception ei){ei.printStackTrace();} MediaTracker mt = new MediaTracker(panel); mt.addImage(img,0); try{ mt.waitForID(0); }catch(InterruptedException e1){ e1.printStackTrace(); } drawImg = img; tDrawImg = new Thread(rDrawImg); tDrawImg.start(); return; }else{ tLoadMedia = new Thread(rLoadMedia); tLoadMedia.start(); } }这是多媒体的装载线程:Runnable rLoadMedia = new Runnable(){ public void run(){ if(Thread.currentThread() == tLoadMedia){ URL url = null; try{ //url = new URL("http://zx3/gis/gis_gm/data_manager/MPEG/twxd/123.mpg"); url = new URL(strUrl); //System.out.println ("¼ÓÔØÍøÂçÊÓƵ³É¹¦:"+strUrl); }catch(Exception er){ System.out.println ("½¨Á¢URL³öÒì³£"); er.printStackTrace(); } //if ((mrl = new MediaLocator("file:///"+mediaFile1)) == null) //if((mrl = new MediaLocator(url)) == null); // Fatal("Can't build URL for " + url); try { player = Manager.createPlayer(url); } catch (Exception em) { em.printStackTrace(); Fatal("Could not create player for " + url); } player.addControllerListener(DisplayMedia.this); tPlayMedia = new Thread(rMedia); tPlayMedia.start(); } System.out.println ("*******À뿪װÔضàýÌåÏß³Ì*******"); } };这是多媒体的播放线程,代码比较乱,呵呵..Runnable rMedia = new Runnable(){ public void run(){ if(hasBeCancel) return; if(player == null){ System.out.println ("media file not find"); }else{ System.out.println ("Playing media file"); player.start(); } } }; 我列出来的包括图片和视频文件,图片就直接画出来,没有调用到JMF,不管图片部分 在这里贴大段的代码是非常难读的诶。。找个地方把你的player关掉然后删除看看吧。 唉,问题总算解决了.没有调用player.close()这个方法 多谢老兄了,调用了player.close()后,播放器会自己把那也是个生成的临时文件删除,不用我动手删除了.不过我发现一个新问题,用URL从网上读视频时,是边下载边播放的.还没下载完就开始播放了,这样,它在播放的时候没有了那个进度条了,替代的是显示的播放时间.这样,如果视频很长时,它就不能前进后退了,这很不爽啊.而它下载完后,第二次播放的时候,它又会下载一个新的临时视频文件,所以还是一样. 不能抛出RuntimeException类型的异常 java 继承 求助 JDK 里面的jar是如何防止反编译的? 如何获得spring中配置的datasource? 请教下, 怎么从一个变量中得到一个变量的实例? 简单问题,加散分! 为什么在applet中画的图一放大缩小页面就错位!!! 谁有jvm specification,英文版的,谢谢 请教:如果向作一个防火墙,主要应作那些事情? 请问现在最流行的java集成开发环境是什麽?最好的java集成开发环境是什麽? 有兴趣的进来,看一看
Runnable rScan = new Runnable(){
public void run(){
while(Thread.currentThread() == tScan){
if(fileTitle == null)
return;
while(isContinue){
iItem++;
if(iItem == fileTitle.length){
iItem = 0;
}
mediaList.setSelectedIndex(iItem);
isContinue = false;
}
}
System.out.println ("À뿪ɨÃèÏß³Ì");
}
};这是JList事件监听处理
public void valueChanged(ListSelectionEvent e){
int si;
si = mediaList.getSelectedIndex();
if(si == old_si)
return;
old_si = si;
//System.out.println ("´¥·¢Ñ¡Ôñlistʼþ,µ±Ç°Ñ¡ÔñΪ:si="+si);
isContinue = false;
isDraw = true;
drawImg = null;
stop();
tLoadMedia = null;
//ɾ³ý»º´æÖеÄÎļþ;
String delPath = "C:\\WINNT\\Temp\\";
File dirDel = new File(delPath);
if(dirDel.isDirectory()){
String[] fileDelList = dirDel.list();
for(int di=0;di<fileDelList.length;di++){
if(fileDelList[di].endsWith(".MPG") || fileDelList[di].endsWith(".avi")){
File fileDel = new File(delPath + fileDelList[di]);
if(fileDel.isFile()){
fileDel.delete();
}
}
}
} if(tDrawImg != null){
tDrawImg.interrupt();
tDrawImg = null;
}
btStop.setEnabled(true);
btPlay.setEnabled(false);
//chosenFile = (String)mediaList.getSelectedValue();
chosenFile = filePath[si];
strUrl = strImgURL + chosenFile;
//¶ÁͼƬ˵Ã÷ÎÄ×Ö;
imgIntro = fileIntro[si];
txtIntro.setText(imgIntro);
iItem = si;
System.out.println ("selection = " + chosenFile + ",,,hasBeCancel="+this.hasBeCancel);
Graphics g = panel.getGraphics();
panel.removeAll();
if(g != null){
g.setColor(new Color(245,249,236));
//g.fillRect(0,0,panel.WIDTH,panel.HEIGHT);
g.fillRect(0,0,320,260);
g.setColor(Color.black);
g.drawString("ÕýÔÚ×°ÔضàýÌåÐÅÏ¢,ÇëÉÔºò...",50,100);
}
if(player != null){
player.deallocate();
player = null;
}
int pos = strUrl.lastIndexOf(".");
String exName = strUrl.substring(pos+1);
//System.out.println ("exname="+exName);
if(exName.equalsIgnoreCase("jpg") || exName.equalsIgnoreCase("gif")){
//ÊÇͼƬ;
panel.setBounds(0,0,320,240);
panel.invalidate();
Image img = null;
try{
//img = Toolkit.getDefaultToolkit().getImage("media\\"+path+"\\"+ID+"\\media\\"+chosenFile);
URL url = new URL(strUrl);
img = Toolkit.getDefaultToolkit().getImage(url);
//System.out.println ("¼ÓÔØͼƬ³É¹¦:"+strUrl);
}catch(Exception ei){ei.printStackTrace();}
MediaTracker mt = new MediaTracker(panel);
mt.addImage(img,0);
try{
mt.waitForID(0);
}catch(InterruptedException e1){
e1.printStackTrace();
}
drawImg = img;
tDrawImg = new Thread(rDrawImg);
tDrawImg.start();
return;
}else{
tLoadMedia = new Thread(rLoadMedia);
tLoadMedia.start();
}
}这是多媒体的装载线程:
Runnable rLoadMedia = new Runnable(){
public void run(){
if(Thread.currentThread() == tLoadMedia){
URL url = null;
try{
//url = new URL("http://zx3/gis/gis_gm/data_manager/MPEG/twxd/123.mpg");
url = new URL(strUrl);
//System.out.println ("¼ÓÔØÍøÂçÊÓƵ³É¹¦:"+strUrl);
}catch(Exception er){
System.out.println ("½¨Á¢URL³öÒì³£");
er.printStackTrace();
}
//if ((mrl = new MediaLocator("file:///"+mediaFile1)) == null)
//if((mrl = new MediaLocator(url)) == null);
// Fatal("Can't build URL for " + url);
try {
player = Manager.createPlayer(url);
} catch (Exception em) {
em.printStackTrace();
Fatal("Could not create player for " + url);
}
player.addControllerListener(DisplayMedia.this);
tPlayMedia = new Thread(rMedia);
tPlayMedia.start();
}
System.out.println ("*******À뿪װÔضàýÌåÏß³Ì*******");
}
};这是多媒体的播放线程,代码比较乱,呵呵..
Runnable rMedia = new Runnable(){
public void run(){
if(hasBeCancel)
return;
if(player == null){
System.out.println ("media file not find");
}else{
System.out.println ("Playing media file");
player.start();
}
}
};