1

Тема: Відтворити аудіо файли в циклі

В мене є папка з аудіофайлами і я хочу щоб вони по черзі програвалися.
Але відтворюеться лише один файл.



try {
              File myFolder = new File("C:\\Documents and Settings\\Мои документы\\NetBeansProjects\\soundClip\\Clip");
              File[] files = myFolder.listFiles();
         
            for(int i=0; i<files.length; i++){
                 System.out.println("files[i].getName()     -    "+files[i].getName());
            }
             
              for(int i=0; i<files.length; i++){
                   File soundFile = files[i];
                 
                  AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);

                    Clip clip = AudioSystem.getClip();
    
                    clip.open(ais);
    
                    clip.setFramePosition(0); 
                    clip.start(); 

                    Thread.sleep(clip.getMicrosecondLength()/1);
                    clip.stop(); 
                    clip.close(); 
                   // soundFile.delete();
              }
        } catch(IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
             exc.printStackTrace();
        } catch (InterruptedException exc) {}

2

Re: Відтворити аудіо файли в циклі

А виключні ситуації не трапляються?

3

Re: Відтворити аудіо файли в циклі

koala написав:

А виключні ситуації не трапляються?

Коли запускаю то в neтbeans працює ніби все нормально. Ніяких помилок не виводить .  Якщо ви про це. 
Можливо Ви хотіли сказати що  є   виключні ситуації які не виводяться при запуску програми  в neтbeans,  але їх треба обробити ?

4

Re: Відтворити аудіо файли в циклі

Lujok написав:
koala написав:

А виключні ситуації не трапляються?

Коли запускаю то в neтbeans працює ніби все нормально. Ніяких помилок не виводить .  Якщо ви про це. 
Можливо Ви хотіли сказати що  є   виключні ситуації які не виводяться при запуску програми  в neтbeans,  але їх треба обробити ?

А як може вивестись виключна ситуація, якщо у вас пустий блок catch?

Подякували: koala1

5 Востаннє редагувалося Lujok (14.01.2016 12:35:41)

Re: Відтворити аудіо файли в циклі

quez написав:

А як може вивестись виключна ситуація, якщо у вас пустий блок catch?

Я вствляв в блок catch  строку(просто тут не написав)  : System.out.println("InterruptedException");   ,   нічого не виводиться.

catch (InterruptedException exc) {
                System.out.println("InterruptedException");
            }

6 Востаннє редагувалося fed_lviv (14.01.2016 15:55:46)

Re: Відтворити аудіо файли в циклі

Lujok написав:

В мене є папка з аудіофайлами і я хочу щоб вони по черзі програвалися.
Але відтворюеться лише один файл.

Ніколи, не працював з Java+аудіо файли, але просто заради цікавості, навіщо

...
clip.stop(); 
clip.close(); 
...

Ось, можливо це Вам підійде:
https://www.youtube.com/watch?v=QVrxiJyLTqU
Просто кількість програвань, виставіть в циклі в залежності від к-сті файлів в папці

 Thread.sleep(clip.getMicrosecondLength()/1);

long getMicrosecondLength()
Obtains the media duration in microseconds
public static void sleep(long millis) throws InterruptedException

Подякували: Lujok1

7 Востаннє редагувалося Lujok (24.01.2016 20:53:37)

Re: Відтворити аудіо файли в циклі

Дякую,  вдається відтворювати аудіо файли в циклі . 
Тепер проблема в тому щоб одночасно в мітці зявлялась назва файла який відтворюється. Зявлялась лише назва останнього файла після того як всі файли програються. Мені порадили скористатися багатопоточністю.  Я тільки почав її вивчати . Вдалось зробити так щоб   мітці зявлялалась назва файла який відтворюється  лише коли файли відтворювати не в циклі , а при натисканні на кнопку. Тобто щоб відтворити один файл щоразу треба натискати на кнопку.  ось код (повторюсь що багатопоточність я лише почав вивчати , буду вдячний за поради) :
створив два класи які реалізують Runnable()  . один програє файл , а інший в мітку записує назву цього файла.  Потім ці потоки добавляються в Лісенер для кнопки :

public class recS implements Runnable{
    Thread t;
    File soundFile;
    public recS (File soundFile){
        this.soundFile = soundFile;
        t = new Thread(this, "recS");
        System.out.println(" public recS ()");
        t.start();   
    }
    @Override
    public void run() {
            try {
                 playSound(soundFile);
                Thread.sleep(5000);
            } catch (InterruptedException ex) {
                Logger.getLogger(recS.class.getName()).log(Level.SEVERE, null, ex);
                System.err.println("переривання recS");     
            }
    }
    
     private  void playSound( File soundFile) {
       try{ 
           Clip clip = AudioSystem.getClip();
           clip.open(AudioSystem.getAudioInputStream(soundFile));
           clip.start();
            Thread.sleep(clip.getMicrosecondLength()/1000);
            Thread.sleep(1000); 
       
       }catch(Exception ex){
           System.out.println("Exception");      
       }   
    }
}


public class jLab implements Runnable{
    Thread jlT ;
    JLabel label;
    File soundFile;
    public jLab(JLabel label, File soundFile){
        this.soundFile = soundFile;
        this.label = label;
        jlT = new Thread(this, "jLab");
        System.out.println("public jLab()");
        jlT.start();
    }
  
    @Override
    public void run() {
           label.setText("text--"+soundFile.getName());

    }
    
}



class buttonAL2Listener implements ActionListener {
    JLabel label;
    SoundClip sCobj = new SoundClip();
    public buttonAL2Listener(JLabel label) {
       this.label = label;
      
    }
  
    @Override
    public void actionPerformed(ActionEvent ae) {
      
         File soundFile = new File("C:\\Documents and Settings\\Мои документы\soundClip\\Clip");
          File[] files = soundFile.listFiles();
          
            new recS( files[sCobj.getCountFile()]);      // Програються файли
            new jLab(label, files[sCobj.getCountFile()] );  //  В мітку записується назва файла 
            
            sCobj.setIterCountFile();       // Збільшує лічильник файлів на 1 .
            if(sCobj.getCountFile() ==  3){
                sCobj.setCountFile(0);
            }
    }
}

Мені треба щоб в циклі відтворювались файли та в мітці зявлалась назва файла .  Це невдається . Відразу всі файли відтворюються ну а в мітці назва останнього файла.  Спробував в Лісенер додати такий код (не знаю чи він тут доречний взагалі) :

  Thread.sleep(5000);

після цього файли відтворюються послідовно . але в мітці зявляється назва лише останнього файла після того як всі файли відтворяться.

8 Востаннє редагувалося fed_lviv (25.01.2016 10:29:31)

Re: Відтворити аудіо файли в циклі

Спробуйте в SWINGу для багатопоточності використовувати public abstract class SwingWorker<T,V>, це в принципі той ж Runnable, але просто, для початку роботи з багатопоточністю, значно легше розуміється.

 Thread.sleep(5000);

А чому, саме 5000?
P.S.

public class jLab
public class recS
class buttonAL2Listener

Якось гарніше, спробуйте називати, свої класи + бажано з великої літери  ;)
P.P.S. А, як там Ваша програмка "словник" поживає? Чому перейшли на МУЗІКУ?  :)

Подякували: Lujok1

9 Востаннє редагувалося iovchynnikov (25.01.2016 10:34:00)

Re: Відтворити аудіо файли в циклі

fed_lviv написав:

P.S.

public class jLab
public class recS
class buttonAL2Listener

Якось гарніше, спробуйте називати, свої класи + бажано з великої літери  ;)

Свої п'ять копійок: пропоную автору ознайомитися з Java Code Conventions хоча б у такій скороченій формі http://www.oracle.com/technetwork/java/ … 35099.html

Подякували: Lujok1

10 Востаннє редагувалося Lujok (25.01.2016 19:32:31)

Re: Відтворити аудіо файли в циклі

fed_lviv написав:

P.P.S. А, як там Ваша програмка "словник" поживає? Чому перейшли на МУЗІКУ?  :)

Оце ж я її і розвиваю . Вже є словник  який можно редагувати,  добавляти(видаляти) теми, є тест для вибору вірного варіанту перевода .  Тепер хочу аудіо добавити щоб можно було спочатку слухати слова (напр. англійською ) , потім користувач повторює і це записується , і потім прослуховується.

Подякували: fed_lviv1

11

Re: Відтворити аудіо файли в циклі

fed_lviv написав:
 Thread.sleep(5000);

А чому, саме 5000?

5 сек . стільки приблизно звучать файли зі словами .

12

Re: Відтворити аудіо файли в циклі

Вони, ВСІ по 5 сек.?

13 Востаннє редагувалося Lujok (25.01.2016 19:53:10)

Re: Відтворити аудіо файли в циклі

fed_lviv написав:

Вони, ВСІ по 5 сек.?

Ні , звичайно . Я просто спробував

14 Востаннє редагувалося Lujok (25.01.2016 21:27:04)

Re: Відтворити аудіо файли в циклі

fed_lviv написав:
Спробуйте в SWINGу для багатопоточності використовувати public abstract class SwingWorker<T,V>, це в принципі той ж Runnable, але просто, для початку роботи з багатопоточністю, значно легше розуміється.

Погуглив і знайшов лише англійською.  Англійську тільки вчу . В мене по багатопоточності є Шилдт "Swing Руководство для начинающих. " , ще пару сайтів знайшов , та відео в ютюбі .  Але там нічого нема про  public abstract class SwingWorker<T,V>   .  Тому мабудь легше не стане .)))

15

Re: Відтворити аудіо файли в циклі

Lujok написав:

Оце ж я її і розвиваю . Вже є словник  який можно редагувати,  добавляти(видаляти) теми, є тест для вибору вірного варіанту перевода .  Тепер хочу аудіо добавити щоб можно було спочатку слухати слова (напр. англійською ) , потім користувач повторює і це записується , і потім прослуховується.

+

Lujok написав:

Погуглив і знайшов лише англійською.  Англійську тільки вчу

Ну, Ви і ледачий!  :P
http://spec-zone.ru/RU/Java/Docs/7/api/ … orker.html
http://javapower.ru/?p=203
http://skipy.ru/technics/gui_sync.html
...

Подякували: Lujok, leofun012

16 Востаннє редагувалося fed_lviv (26.01.2016 16:40:20)

Re: Відтворити аудіо файли в циклі

Ну, якщо, і посилання, не допомогли, або не любити російську, ось для прикладу:
P.S. Зверніть увагу на коментарі в класі MyWork

package my;

import java.util.List;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.Action;
import javax.swing.AbstractAction;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class MainFrame extends JFrame {

    private JButton but = new JButton(new MyAction());
    private JLabel lab = new JLabel("0");

    public MainFrame() {
        setTitle("Music");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        add(but);
        add(lab);
        setSize(200, 200);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) throws InterruptedException {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainFrame();
            }
        });
    }

    class MyAction extends AbstractAction {

        public MyAction() {
            putValue(Action.NAME, "Start");
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            new MyWork().execute();
            setEnabled(false);
        }
    }

    class MyWork extends SwingWorker<String, Integer> {

        // ось в цьому методі запускайте пісні, це буде окремий потік!!!
        // GUI з цього методу не чіпайте!!!!!! (хоч пару методів можна, див. документацію)
        @Override
        protected String doInBackground() throws Exception {
            int i = 0;
            while (i <= 10) {
                // викидаєм проміжкові результати (наприклад - час), це можете не застосовувати
                publish(i);
                System.out.println("La-la-la");
                Thread.sleep(1000);
                i++;
            }
            return null;
        }

        // метод для обробки проміжкових резльтатів
        // GUI можна чіпати
        @Override
        protected void process(List<Integer> list) {
            lab.setText(list.get(0) + "");
        }

        // метод викликається, після закінчення виконання метода doInBackground()
        // GUI можна чіпати
        @Override
        public void done() {
            but.setEnabled(true);
        }
    }
}
Подякували: Lujok, leofun012

17 Востаннє редагувалося Lujok (14.02.2016 19:43:48)

Re: Відтворити аудіо файли в циклі

Тепер проблема щоб завершити завчаснно
коли файл програється то коли натиснути кнопку stop(stopAudioActionListener) нічого не завершується тільки на консоль зявляеться : System.out.println(" public void done() {////////////////////____ КІНЕЦЬ _____\\\\\\\\\\\\\\ll");

Завершується тільки  між програваннями файлів , а коли якийсь файл програється то нічого не вдається. Крім того є лише одна спроба, якщо з першої спроби не встиг між програванням файлів то вже нічого не вийде взагалі.

 
public class Person {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException,      IllegalAccessException, SQLException {
.......

       NewClassMyWork newClassMyWork = new NewClassMyWork(label, button1, labelSp, textFileChooser, progressBar2);
       stopAudio.addActionListener(new stopAudioActionListener(  newClassMyWork));
......

}
}

public class NewClassMyWork extends SwingWorker <String, Integer>{

 File soundFile = new File("C:\\Documents and Settings\\s\\Мои документы\\NetBeansProjects\\SwingWork1\\Clip");
File[] files = soundFile.listFiles();

@Override
    protected String doInBackground() throws Exception {
        
            for(int n = 0; n < files.length; n++){
                
                      publish(n);
                      playSound(  files[n]);

                      publish(n);
                      playSound(  files[n]);
                       
            
        }
            return null;
    
    }


@Override
        public void done() {
            try{
                
                labelSp.setText( get() );  
                 
            }catch(CancellationException e){

                System.out.println(" public void done() {////////////////////____ КІНЕЦЬ _____\\\\\\\\\\\\\\ll");
                labelSp.setText( " КІНЕЦЬ ." );  
                label.setText("_______");

            } catch (Exception e) {
                    e.printStackTrace();
                }
            progressBar2.setValue(0); 
             button1.setEnabled(true);
        }

private  void playSound( File soundFile) {
                        try{ 
                            bool = true;
                            Clip clip = AudioSystem.getClip();
                            clip.open(AudioSystem.getAudioInputStream(soundFile));
                            clip.start();
                            th = clip.getMicrosecondLength()/1000;
                            Thread.sleep(th);
       
                        }catch(Exception ex){
                         
                            bool = false;
                        } 
    }

}


Слухач для кнопки завчасної перерви роботи потоку:
class stopAudioActionListener implements ActionListener {
    NewClassMyWork newClassMyWork;

    public stopAudioActionListener(   NewClassMyWork newClassMyWork) {
        this.newClassMyWork = newClassMyWork;
    }


    @Override
    public void actionPerformed(ActionEvent ae) {
        newClassMyWork.cancel(true);  
    }
    
}

18 Востаннє редагувалося fed_lviv (15.02.2016 09:32:26)

Re: Відтворити аудіо файли в циклі

Lujok написав:

Тепер проблема щоб завершити завчаснно
коли файл програється то коли натиснути кнопку stop(stopAudioActionListener) нічого не завершується тільки на консоль зявляеться : System.out.println(" public void done() {////////////////////____ КІНЕЦЬ _____\\\\\\\\\\\\\\ll");

;)  Спробуйте:

clip.stop();
Lujok написав:

Завершується тільки  між програваннями файлів , а коли якийсь файл програється то нічого не вдається. Крім того є лише одна спроба, якщо з першої спроби не встиг між програванням файлів то вже нічого не вийде взагалі.

Звісно, що не вийде, Ви ж:

cancel(true);

Як то кажуть, потяг пішов.

Подякували: Lujok1

19

Re: Відтворити аудіо файли в циклі

Один з варіантів:

import java.util.List;

import java.io.File;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.AudioInputStream;

public class First extends JFrame {

    private static Clip clip;
    private static File file;
    private MyWork work;
    private JButton butStart = new JButton("Start");
    private JButton butStop = new JButton("Stop");
    private JLabel lab = new JLabel("");

    public First() {
        setTitle("Test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        add(butStart);
        add(butStop);
        butStop.setEnabled(false);
        setListeners();
        add(lab);
        setSize(400, 200);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void setListeners() {
        butStart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                work = new MyWork();
                work.execute();
                butStart.setEnabled(false);
                butStop.setEnabled(true);
            }
        });
        butStop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                clip.stop();
                work.cancel(true);
            }
        });
    }

    public static void main(String[] args) throws Exception {
        file = new File("rain.wav");
        clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(file);
        clip.open(inputStream);
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new First();
            }
        });
    }

    class MyWork extends SwingWorker<Void, String> {

        @Override
        protected Void doInBackground() throws Exception {
            publish(file.getName());
            clip.setMicrosecondPosition(0);
            clip.start();
            Thread.sleep(clip.getMicrosecondLength() / 1000);
            clip.stop();
            return null;
        }

        @Override
        protected void process(List<String> list) {
            lab.setText(list.get(0));
        }

        @Override
        public void done() {
            butStart.setEnabled(true);
            butStop.setEnabled(false);
            lab.setText("");
        }
    }
}
Подякували: leofun01, Lujok2

20

Re: Відтворити аудіо файли в циклі

fed_lviv написав:

Один з варіантів:

Я по іншому робив . В мене в методі  main ()  створюється обект класа  NewClassMyWork ,  потім передаю його по параметрам в 2 лісенера для кнопок старту та зупинки програвання файлів . Я зтикнувся з тим що після одного програвання всіх файлів ще раз було неможливо повторити це . Я грішу на те що не вірно структуру програми реалізував. Як на Вашу думку  вірно думаю :  при запуску програми в мене сворюється обьект класа NewClassMyWork , йому виділяється память, і коли натиснути кнопку старт (для запуску програвання файлів) файли програються. А після того як робота потоку  припинеться то і  обьекта класа вже не існує. Тому неможливо повторно програти файли . ?