javascript - सरस - हाइट बढ़ाने के कैप्सूल




मैं क्रोम में MediaRecorder से रिकॉर्ड किए गए ऑडियो में पूर्वनिर्धारित लंबाई कैसे जोड़ सकता हूं? (2)

मैं Chrome में ऑडियो रिकॉर्ड करने के लिए बनाया गया MediaRecorder में RecordRTC को बदलने की प्रक्रिया में हूं। तब रिकॉर्ड किए गए ऑडियो को ऑडियो एपी के साथ प्रोग्राम में चलाया जाता है। मुझे काम करने के लिए ऑडियो। अवधि संपत्ति प्राप्त करने में परेशानी हो रही है। इसे कहते हैं

यदि वीडियो (ऑडियो) स्ट्रीम किया गया है और कोई पूर्वनिर्धारित लंबाई नहीं है, तो "Inf" (Infinity) वापस आ जाता है।

RecordRTC के साथ, मुझे ऑडियो को wav से ogg में बदलने के लिए ffmpeg_asm.js का उपयोग करना पड़ा। मेरा अनुमान कहीं है कि RecordRTC प्रक्रिया में पूर्वनिर्धारित ऑडियो लंबाई निर्धारित करता है। क्या MediaRecorder का उपयोग करके पूर्वनिर्धारित लंबाई निर्धारित करने का कोई तरीका है?


क्रोम में एक बग, 2016 में पता चला, लेकिन आज भी (मार्च 2019) खुला, इस व्यवहार के पीछे मूल कारण है। कुछ परिदृश्यों के तहत audioElement.duration Infinity लौटाएगा।

क्रोम बग जानकारी here और here

बग से बचने के लिए निम्न कोड वर्कअराउंड प्रदान करता है

उपयोग : अपना audioElement बनाएं, और अपने audioElement का संदर्भ प्रदान करते audioElement , इस फ़ंक्शन को एक बार कॉल करें। जब लौटा हुआ promise हल होता है, तो audioElement.duration संपत्ति में सही मान होना चाहिए। (यह videoElements साथ भी यही समस्या ठीक करता है)

/**
 *  calculateMediaDuration() 
 *  Force media element duration calculation. 
 *  Returns a promise, that resolves when duration is calculated
 **/
function calculateMediaDuration(media){
  return new Promise( (resolve,reject)=>{
    media.onloadedmetadata = function(){
      // set the mediaElement.currentTime  to a high value beyond its real duration
      media.currentTime = Number.MAX_SAFE_INTEGER;
      // listen to time position change
      media.ontimeupdate = function(){
        media.ontimeupdate = function(){};
        // setting player currentTime back to 0 can be buggy too, set it first to .1 sec
        media.currentTime = 0.1;
        media.currentTime = 0;
        // media.duration should now have its correct value, return it...
        resolve(media.duration);
      }
    }
  });
}

// USAGE EXAMPLE :  
calculateMediaDuration( yourAudioElement ).then( ()=>{ 
  console.log( yourAudioElement.duration ) 
});

बग की पहचान करने और काम करने की पेशकश की पेशकश के लिए @ कैइडो का धन्यवाद।

मैंने एक एनपीएम पैकेज तैयार किया है जिसे गेट get-blob-duration कहा जाता है जिसे आप गंदा काम करने के लिए एक अच्छा प्रोमिस-लिपटे फ़ंक्शन प्राप्त करने के लिए स्थापित कर सकते हैं।

उपयोग निम्नानुसार है:

// Returns Promise<Number>
getBlobDuration(blob).then(function(duration) {
  console.log(duration + ' seconds');
});

या ECMAScript 6:

// yada yada async
const duration = await getBlobDuration(blob)
console.log(duration + ' seconds')






recordrtc