2011-11-07 10 views
7

मैं जावाएफएक्स एसडीके 2.0.1 का उपयोग कर जावाएफएक्स 2.0 एप्लिकेशन में लूप में पृष्ठभूमि ऑडियो चलाने की कोशिश कर रहा हूं। मैं एक MediaPlayer कोड का निम्न भाग द्वारा बनाई उपयोग करने का फैसला:JavaFX 2.0 में समानांतर में क्लीन ऑडियो लूप और एक-शॉट ध्वनियां कैसे खेलें?

MediaPlayerBuilder 
.create().media(BACKGROUND_MEDIA) 
.cycleCount(MediaPlayer.INDEFINITE); 

यह मूलतः काम करता है, लेकिन जब एक नया चक्र शुरू होता है एक छोटे से (विलंबता?) है अंत और ऑडियो की शुरुआत के बीच की खाई। तो यह मेरे लिए एक कामकाजी विकल्प नहीं है क्योंकि यह एक साफ पाश नहीं खेल रहा है।

मैंने एक नया मीडियाप्लेयर ऑब्जेक्ट बनाने और मीडिया समाप्त होने पर प्लेबैक शुरू करने का निर्णय लिया। यह अब तक ठीक काम करता है। इसके अतिरिक्त, मैं क्लिक करते समय एक लघु ऑडियोक्लिप खेलने वाला बटन उपयोग करता हूं। मैंने पाया कि इस बटन पर लगातार और तेजी से क्लिक करने से पृष्ठभूमि ऑडियो में बाधा आती है। जब बटन एक बार क्लिक किया जाता है तो मैंने वॉल्यूम 0 के साथ ऑडियो क्लिप को अनिश्चित काल तक इस व्यवहार को पुन: उत्पन्न करने के लिए एक उदाहरण बनाया है। उदाहरण स्वयं निहित नहीं है, क्योंकि आवश्यक ऑडियो फाइलें गायब हैं। (300 मि.से एक बहुत कम क्लिक ध्वनि ~)

  • background.wav (ऑडियो के ~ 5 सेकंड)
    • click.wav: यह परियोजना के स्रोत निर्देशिका में 2 ऑडियो फ़ाइलें डालना होता है, जब मैं एक-शॉट ऑडियो ध्वनियां बजायी जाती हूं तो इन इंटरप्ट्स के बिना पृष्ठभूमि में एक साफ ऑडियो लूप कैसे खेल सकता हूं? क्या यह सिर्फ एक प्रदर्शन मुद्दा है?

      उदाहरण:

      package mediatest; 
      
      import javafx.application.Application; 
      import javafx.event.ActionEvent; 
      import javafx.event.EventHandler; 
      import javafx.scene.Group; 
      import javafx.scene.Scene; 
      import javafx.scene.control.Button; 
      import javafx.scene.media.AudioClip; 
      import javafx.scene.media.Media; 
      import javafx.scene.media.MediaPlayer; 
      import javafx.scene.media.MediaPlayerBuilder; 
      import javafx.stage.Stage; 
      
      public class MediaTest extends Application { 
      
          private static final AudioClip CLICK_AUDIOCLIP = new AudioClip(MediaTest.class.getResource("/click.wav").toString()); 
          private static final Media BACKGROUND_MEDIA = new Media(MediaTest.class.getResource("/background.wav").toString()); 
      
          private MediaPlayerBuilder builder; 
      
          public static void main(String[] args) { 
           Application.launch(args); 
          } 
      
          @Override 
          public void start(Stage primaryStage) { 
           Group root = new Group(); 
           Scene scene = new Scene(root, 300, 250); 
      
           this.builder = MediaPlayerBuilder 
               .create() 
               .media(BACKGROUND_MEDIA) 
               .onEndOfMedia(new Runnable() { 
      
                public void run() { 
                 MediaPlayer player = MediaTest.this.builder.build(); 
                 player.play(); 
                } 
               }); 
      
           MediaPlayer player = this.builder.build(); 
           player.play(); 
      
           Button btn = new Button(); 
           btn.setText("Repeat playing short audio clip"); 
           btn.setOnAction(new EventHandler<ActionEvent>() { 
      
            public void handle(ActionEvent event) { 
             //Simulation of many button clicks 
             MediaTest.CLICK_AUDIOCLIP.setCycleCount(AudioClip.INDEFINITE); 
             MediaTest.CLICK_AUDIOCLIP.play(0); 
            } 
           }); 
      
           root.getChildren().add(btn); 
      
           primaryStage.setScene(scene); 
           primaryStage.show(); 
          } 
      } 
      
    +1

    पृष्ठभूमि ऑडियो के लिए 'javax.sound.sampled.SourceDataLine' का उपयोग करते समय कोई समस्या नहीं है। 'Javafx.scene.media.Media' के साथ ऑडियो प्लेबैक अलग काम करता प्रतीत होता है। – pmoule

    उत्तर

    0

    public void handle(ActionEvent event) { 
          Platform.runLater(new Runnable() 
          { 
           @Override 
           public void run() 
           { 
            //Simulation of many button clicks 
            MediaTest.CLICK_AUDIOCLIP.setCycleCount(AudioClip.INDEFINITE); 
            MediaTest.CLICK_AUDIOCLIP.play(0); 
           } 
          }); 
         } 
        }); 
    

    में एक और धागे का उपयोग रुकावट

    +1

    धन्यवाद, लेकिन कोड पहले से ही जावाएफएक्स अनुप्रयोग धागा पर निष्पादित करता है। इसलिए, Platform.runlater (...) 'को कॉल करते समय कोई अलग व्यवहार नहीं है। मैंने घटना को नए बनाए गए धागे में 'नया थ्रेड (नया रननेबल (...)) के साथ चलाने की कोशिश की। प्रारंभ(); '। मुद्दा अभी भी मौजूद है। – pmoule

    1

    आप ExecutorService में देखा है की समस्या को हल कर सकते हैं? इसके बाद आपके पास कई पूर्वनिर्धारित धागे होंगे:

    ExecutorService service = Executors.newFixedThreadPool(4); 
    

    जहां 4 धागे की संख्या है। यह प्रदर्शन में सुधार करेगा क्योंकि यह हर बार जब आप कुछ चलाने के लिए एक नया बनाने के बजाय पहले से बनाए गए धागे का उपयोग करता है।

    आप एक Runnable बनाना होगा और इतने की तरह सेवा के साथ निष्पादित:

    Runnable r = new Runnable() { 
        @Override 
        public void run() { 
         playSound(); 
        } 
    }; 
    service.execute(r); 
    

    इतना ही नहीं प्रदर्शन में सुधार होगा, लेकिन यह स्वचालित रूप से अपने थ्रेड पूल में एक नहीं के वर्तमान-व्यस्त धागा करने के लिए कार्य असाइन करता है।

    यह भी देखें: Playing sound loops using javafx जो मुझे विश्वास है कि आपकी छोटी विलंबता समस्या हल हो जाती है।

    संपादित करें: क्षमा करें, मुझे नहीं पता था कि यह पोस्ट पुराना था। यह गूगल में एक शीर्ष परिणाम था।

    संबंधित मुद्दे