HTML5 ऑडियो स्टॉप फ़ंक्शन


147

मैं अपने नेविगेशन में प्रत्येक लिंक के क्लिक पर एक छोटी ऑडियो क्लिप खेल रहा हूं

HTML कोड:

<audio tabindex="0" id="beep-one" controls preload="auto" >
    <source src="audio/Output 1-2.mp3">
    <source src="audio/Output 1-2.ogg">
</audio>

जेएस कोड:

$('#links a').click(function(e) {
    e.preventDefault();
    var beepOne = $("#beep-one")[0];
    beepOne.play();
});

यह अब तक ठीक काम कर रहा है।

समस्या तब होती है जब कोई साउंड क्लिप पहले से चल रहा हो और मैं किसी भी लिंक पर क्लिक करूँ, कुछ नहीं होता है।

मैंने लिंक के क्लिक पर पहले से चल रही ध्वनि को रोकने की कोशिश की, लेकिन HTML5 के ऑडियो एपीआई में इसके लिए कोई प्रत्यक्ष घटना नहीं है

मैंने कोड का पालन करने की कोशिश की लेकिन यह काम नहीं कर रहा है

$.each($('audio'), function () {
    $(this).stop();
});

कोई सुझाव कृपया?

जवाबों:


350

इसके बजाय stop()आप के साथ कोशिश कर सकते हैं:

sound.pause();
sound.currentTime = 0;

इसका वांछित प्रभाव होना चाहिए।


6
यह क्रोम में काम नहीं कर रहा है। ऑडियो तत्व ऑडियो लोड करता रहता है, जो नहीं होना चाहिए।
पीटर

3
Chrome में <audio>लोडिंग preloadविशेषता के साथ भी जबरदस्ती लोड होती रहती है noneऔर <source>src छीन ली जाती है।
पायनियर आसमान

6
यह काम करता है, धन्यवाद। एक ओर ध्यान दें कि मुझे यह जानकर अच्छा लगेगा कि w3c ने कल्पना में स्टॉप मेथड को शामिल क्यों नहीं किया।
रेहेरिक

25

पहले आपको अपने ऑडियो तत्व के लिए एक आईडी सेट करनी होगी

आपके जेएस में:

var ply = document.getElementById('player');

var oldSrc = ply.src;// सिर्फ पुराने स्रोत को याद करने के लिए

ply.src = "";// खिलाड़ी को रोकने के लिए आपको स्रोत को कुछ नहीं के साथ बदलना होगा


4
ऑडियो स्ट्रीमिंग के लिए सर्वश्रेष्ठ समाधान
होसैन

1
अच्छी तरह से .. ऑडियो स्रोत फ़ाइल के लिए एक और नेटवर्क अनुरोध करना होगा
Md। अराफ़ात अल महमूद

ऑडियो लोड होने तक नहीं चलेगा, और इससे ऑडियो चलाने में अवांछित देरी होगी।
अभि

समस्या का एक अच्छा समाधान जब इंटरनेट रेडियो और फ़ायरफ़ॉक्स की तरह एक धारा खेल रहा है, जब ठहराव / खेल को टॉगल किया जाता है तो फ़ायरफ़ॉक्स अंतिम बार दोहराता है। आपका बहुत बहुत धन्यवाद।
namikiri 14

14

यहाँ मेरा तरीका है स्टॉप () विधि:

कोड में कहीं:

audioCh1: document.createElement("audio");

और फिर स्टॉप में ():

this.audioCh1.pause()
this.audioCh1.src = 'data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAVFYAAFRWAAABAAgAZGF0YQAAAAA=';

इस तरह हम अतिरिक्त अनुरोध नहीं करते हैं, पुराने को रद्द कर दिया गया है और हमारा ऑडियो तत्व साफ स्थिति में है (क्रोम और एफएफ में परीक्षण किया गया है:>


10

मैं एक ही मुद्दा रहा था। एक स्टॉप को धारा को रोकना चाहिए और यदि रेडियो है तो ऑनप्ले को लाइव होना चाहिए । मेरे द्वारा देखे गए सभी समाधानों में एक नुकसान था :

  • player.currentTime = 0 स्ट्रीम डाउनलोड करता रहता है।
  • player.src = ''बढ़ाने errorघटना

मेरा समाधान:

var player = document.getElementById('radio');
player.pause();
player.src = player.src;

और एच.टी.एम.एल.

<audio src="http://radio-stream" id="radio" class="hidden" preload="none"></audio>

यह क्रोम और फ़ायरफ़ॉक्स में काम करता है। हालाँकि, फ़ायरफ़ॉक्स में इसके परिणामस्वरूप निम्न त्रुटि (कंसोल में) होती है [ Security Error: Content at https://localhost/url.html may not load data from blob:https://localhost/cac32534-78b0-4a62-8355-cc8f1e708d64.] इसका कोई नकारात्मक प्रभाव नहीं पड़ता है क्योंकि कोड इसके बाद भी निष्पादित करना जारी रखता है (बिना किसी अपवाद के)।
3

6

यह विधि काम करती है:

audio.pause();
audio.currentTime = 0;

लेकिन अगर आप कोड की इन दो पंक्तियों को हर बार लिखना नहीं चाहते हैं तो आप एक ऑडियो को रोक सकते हैं जो आप दो चीजों में से एक कर सकते हैं। दूसरा मुझे लगता है कि यह अधिक उपयुक्त है और मुझे यकीन नहीं है कि "जावास्क्रिप्ट मानकों के देवताओं" ने यह मानक क्यों नहीं बनाया है।

पहला तरीका: एक फंक्शन बनाएं और ऑडियो पास करें

function stopAudio(audio) {
    audio.pause();
    audio.currentTime = 0;
}

//then using it:
stopAudio(audio);

दूसरी विधि (इष्ट): ऑडियो वर्ग का विस्तार करें:

Audio.prototype.stop = function() {
    this.pause();
    this.currentTime = 0;
};

मेरे पास यह एक जावास्क्रिप्ट फ़ाइल है जिसे मैंने "AudioPlus.js" कहा है, जिसे मैं अपने html में किसी भी स्क्रिप्ट से पहले शामिल करता हूं जो ऑडियो के साथ काम करेगा।

तब आप ऑडियो ऑब्जेक्ट पर स्टॉप फ़ंक्शन को कॉल कर सकते हैं:

audio.stop();

"कैनप्थ्रिथ" के साथ अंतिम रूप से चार्ली ISSUE:

मैंने सभी ब्राउज़रों में इसका परीक्षण नहीं किया है लेकिन यह एक ऐसी समस्या है जो मुझे क्रोम में आई। यदि आप ऐसे ऑडियो को करंट टाइम सेट करने का प्रयास करते हैं, जिसमें "कैनप्थ्रिथ" ईवेंट श्रोता है, तो आप उस ईवेंट को फिर से ट्रिगर करेंगे, जिससे अवांछनीय परिणाम हो सकते हैं।

इसलिए, सभी मामलों के समान समाधान, जब आपने एक इवेंट श्रोता को संलग्न किया है जिसे आप वास्तव में सुनिश्चित करना चाहते हैं कि यह फिर से चालू न हो, तो पहली कॉल के बाद ईवेंट श्रोता को हटा देना है। कुछ इस तरह:

//note using jquery to attach the event. You can use plain javascript as well of course.
$(audio).on("canplaythrough", function() {
    $(this).off("canplaythrough");

    // rest of the code ...
});

बक्शीश:

ध्यान दें कि आप ऑडियो वर्ग (या उस मामले के लिए कोई मूल जावास्क्रिप्ट वर्ग) में और भी अधिक कस्टम तरीके जोड़ सकते हैं।

उदाहरण के लिए यदि आप एक "पुनरारंभ" विधि चाहते थे जो ऑडियो को पुनरारंभ करता है तो यह कुछ ऐसा दिख सकता है:

Audio.prototype.restart= function() {
    this.pause();
    this.currentTime = 0;
    this.play();
};

function stopAudio(audio) { audio.pause(); this.audioStream.src = ""; } ऐसा करने से मेरे लिए काम करना समाप्त हो गया और जब पृष्ठ पर ऑडियो चल रहा हो तो क्रोम ब्राउज़र में स्पीकर आइकन को हटा दिया। Chrome संस्करण 59.0.3071.109
lasec0203

सामान्य तौर पर, मैं इस तरह के प्रोटोटाइप का विस्तार करने की सलाह नहीं दूंगा। एक ऑडियो-हेवी एप्लिकेशन में अलग-अलग मामलों के लिए अलग-अलग स्टॉप फ़ंक्शंस हो सकते हैं और प्रोटोटाइप के साथ गड़बड़ करने से लंबी अवधि के
इमो

5

अपने स्वयं के जावास्क्रिप्ट फ़ंक्शन से प्ले / पॉज को टॉगल करने के लिए - जब से मैं एक रेडियो स्ट्रीम संभाल रहा हूं, मैं चाहता था कि यह बफर को साफ कर दे ताकि श्रोता रेडियो स्टेशन के साथ सिंक से बाहर आना समाप्त न करें।

function playStream() {

        var player = document.getElementById('player');

        (player.paused == true) ? toggle(0) : toggle(1);

}

function toggle(state) {

        var player = document.getElementById('player');
        var link = document.getElementById('radio-link');
        var src = "http://192.81.248.91:8159/;";

        switch(state) {
                case 0:
                        player.src = src;
                        player.load();
                        player.play();
                        link.innerHTML = 'Pause';
                        player_state = 1;
                        break;
                case 1:
                        player.pause();
                        player.currentTime = 0;
                        player.src = '';
                        link.innerHTML = 'Play';
                        player_state = 0;
                        break;
        }
}

पता चला है, बस वर्तमान समय को साफ़ करने से क्रोम के नीचे कटौती नहीं होती है, स्रोत को भी साफ़ करने और इसे वापस लोड करने की आवश्यकता होती है। आशा है कि यह मदद करता है।


4

एक साइड नोट के रूप में और क्योंकि मैं हाल ही में स्वीकृत लिंक में दिए गए स्टॉप विधि का उपयोग कर रहा था, इस लिंक के अनुसार:

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events

मैन्युअल रूप से करंट टाइम सेट करने से ऑडियो तत्व पर 'कैनप्लेथ्रू' ईवेंट आग लग सकती है। लिंक में यह फ़ायरफ़ॉक्स का उल्लेख करता है, लेकिन मैंने क्रोम पर मैन्युअल रूप से करंटटाइम सेट करने के बाद इस घटना का सामना किया। इसलिए यदि आपके पास इस घटना से जुड़ा व्यवहार है तो आप एक ऑडियो लूप में समाप्त हो सकते हैं।


3

यह क्रोम में कभी-कभी काम नहीं करता है,

sound.pause();
sound.currentTime = 0;

बस ऐसे ही बदलो,

sound.currentTime = 0;
sound.pause();

2

shamangeorge ने लिखा है:

मैन्युअल रूप से करंट टाइम सेट करने से ऑडियो तत्व पर 'कैनप्लेथ्रू' ईवेंट आग लग सकती है।

यह वास्तव में क्या होगा, और ठहराव भी pauseघटना को ट्रिगर करेगा , दोनों इस तकनीक को "स्टॉप" विधि के रूप में उपयोग के लिए अनुपयुक्त बनाते हैं। इसके अलावा, सेटिंग srcके रूप में जकी ने सुझाव दिया वर्तमान पृष्ठ का URL एक मीडिया फाइल के रूप में लोड करने के लिए (और असफल) खिलाड़ी कोशिश कर देगा यदि autoplayसक्षम किया गया है - सेटिंग srcकरने के लिए nullअनुमति नहीं है; इसे हमेशा एक URL के रूप में माना जाएगा। प्लेयर ऑब्जेक्ट को नष्ट करने का संक्षिप्त तरीका "स्टॉप" विधि प्रदान करने का कोई अच्छा तरीका नहीं है, इसलिए मैं सुझाव दूंगा कि केवल स्टॉप बटन को छोड़ना और ठहराव प्रदान करना और इसके बजाय बैक बटन छोड़ना है - स्टॉप बटन वास्तव में कोई कार्यक्षमता नहीं जोड़ेगा ।


1

यह दृष्टिकोण "जानवर बल" है, लेकिन यह काम करता है मान लें कि jQuery का उपयोग "अनुमति" है। अपने "खिलाड़ी" <audio></audio>टैग को एक div (यहाँ "plHolder" की आईडी के साथ) घेरें।

<div id="plHolder">
     <audio controls id="player">
     ...
     </audio>
<div>

तब इस जावास्क्रिप्ट को काम करना चाहिए:

function stopAudio() {
    var savePlayer = $('#plHolder').html(); // Save player code
    $('#player').remove(); // Remove player from DOM
    $('#FlHolder').html(savePlayer); // Restore it
}

एक ही बात ऊपर के अपने जवाब में जकी द्वारा उपयोग किए बिना, जकी द्वारा समझाया गया है।
आलोक जैन

मैंने इसके साथ प्रयोग नहीं किया था, लेकिन मुझे यकीन नहीं था कि अगर कई <स्रोत> टैग थे, तो उनका तरीका काम करेगा।
user3062615

#FlHolderके लिए एक टाइपो लगता है#plHolder
पायनियर आसमान

1
@ Alok-jain टिप्पणी के जवाब में: मुझे लगता है कि यह उत्तर @zaki के एक से बिल्कुल अलग है। यहां हम DOM में एक तत्व को फिर से प्रस्तुत कर रहे हैं, दूसरे उत्तर में वह srcखिलाड़ी की विशेषता को "खाली" कर रहा है ।
पायनियर स्काईज

0

मेरा मानना ​​है कि यह देखना अच्छा होगा कि क्या ऑडियो राज्य चला रहा है और चालू संपत्ति को रीसेट कर सकता है।

if (sound.currentTime !== 0 && (sound.currentTime > 0 && sound.currentTime < sound.duration) {
    sound.currentTime = 0;
}
sound.play();

0

मेरे लिए वह कोड ठीक काम कर रहा है। (IE10 +)

var Wmp = document.getElementById("MediaPlayer");                
    Wmp.controls.stop();

<object classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6"
    standby="Loading áudio..." style="width: 100%; height: 170px" id="MediaPlayer">...

उममीद है कि इससे मदद मिलेगी।


0

मुझे क्या करना पसंद है पूरी तरह से Angular2 का उपयोग करके नियंत्रण को हटा दें, फिर इसे तब पुनः लोड किया जाए जब अगले गीत में एक ऑडियो पथ हो:

<audio id="audioplayer" *ngIf="song?.audio_path">

फिर जब मैं इसे कोड में अनलोड करना चाहता हूं तो मैं यह करता हूं:

this.song = Object.assign({},this.song,{audio_path: null});

जब अगला गीत सौंपा जाता है, तो नियंत्रण खरोंच से पूरी तरह से फिर से जुड़ जाता है:

this.song = this.songOnDeck;

0

इस त्रुटि को हल करने का सरल तरीका त्रुटि को पकड़ना है।

AudioElement.play () एक वादा लौटाता है, इसलिए .catch () के साथ निम्नलिखित कोड इस मुद्दे का प्रबंधन करना चाहिए:

function playSound(sound) {
  sfx.pause();
  sfx.currentTime = 0;
  sfx.src = sound;
  sfx.play().catch(e => e);
}

नोट: आप तीर फ़ंक्शन को पिछड़े संगतता के लिए एक अनाम फ़ंक्शन के साथ बदलना चाह सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.