2011-03-28 10 views
6

से 2 ध्वनियों को मिलाकर मैंने एक मिक्सर बनाया है और एक सरणी में सभी अनुक्रमों को सहेज लिया है और फिर इसे फिर से चलाएं, अब मैं मिश्रण को एमपी 3 के रूप में सहेजना चाहता हूं, मैंने मिश्रण को बचाने के लिए किसी भी तरह की तलाश की है और उत्तर ध्वनि को लोड करना है जैसे बाइटअरेज़ (sound.extract) मैंने यह स्वीकार किया है कि मुझे वास्तव में यह नहीं पता कि एमपी 3 के रूप में इसे सहेजने के लिए केवल एक बाइटएरे में सभी ध्वनियों को कैसे स्टोर किया जाए, मुझे यह कोड सिर्फ उदाहरण के लिए मिला है, 2 ऑडियो फाइलों को लोड करना और उन्हें अलग बाइटअरेज़ में स्टोर करना, और प्रत्येक ध्वनि को चलाने के लिए, क्या कोई शरीर जानता है कि 2 बाइटअरेज़ को केवल एक में कैसे स्टोर किया जाए?बाइटएरे

var mySound:Sound = new Sound(); 
var sourceSnd:Sound = new Sound(); 
var urlReq:URLRequest = new URLRequest("Track1.mp3"); 
sourceSnd.load(urlReq); 
sourceSnd.addEventListener(Event.COMPLETE, loaded); 
function loaded(event:Event):void 
{ 
    mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound); 
    //mySound.play(); 
} 

var mySound2:Sound = new Sound(); 
var sourceSnd2:Sound = new Sound(); 
var urlReq2:URLRequest = new URLRequest("Track2.mp3"); 
sourceSnd2.load(urlReq2); 
sourceSnd2.addEventListener(Event.COMPLETE, loaded2); 
function loaded2(event:Event):void 
{ 
    mySound2.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound2); 
    mySound2.play(); 
    mySound.play(); 
} 



function processSound(event:SampleDataEvent):void 
{ 
     var bytes:ByteArray = new ByteArray(); 
     sourceSnd.extract(bytes, 8192); 
    event.data.writeBytes(bytes); 
} 

function processSound2(event:SampleDataEvent):void 
{ 
     var bytes:ByteArray = new ByteArray(); 
     sourceSnd2.extract(bytes, 8192); 
    event.data.writeBytes(bytes); 
} 
+0

हे लुओसक्रैड, जब आप इस सवाल से पूछा तो मुझे आपकी ही चुनौतियां हो रही हैं, क्या आप कुछ प्रकाश साझा कर सकते हैं। आपका अंतिम समाधान क्या था, और आप क्या हल नहीं कर सके। धन्यवाद! – GV3

उत्तर

2

अगर मैं आपके सवाल का ठीक से समझ है, तो आप प्रत्येक नमूने के लिए चल बिन्दु डेटा को पढ़ने के लिए उन्हें योग, और अपने नए ऑडियो स्ट्रीम में जिसके परिणामस्वरूप मूल्य लिखने की जरूरत है। यह 50/50 मिश्रण एक स्ट्रेट देगा।

मैं अभी एक संकलक के साथ एक मशीन के लिए पहुँच नहीं है, लेकिन यह कुछ इस तरह (bytes1 संभालने और bytes2 समान अवधि की दो bytearray वस्तुओं रहे हैं) होना चाहिए:

for (int bcnt = bytes1.size(); bcnt; bcnt--) 
    bytes1.setByte(bcnt - 1, bytes2.getByte(bcnt - 1) + bytes1.getByte(bcnt - 1)); 
बेशक

, आप शायद कुछ प्रकार के ओवरफ्लो चेक करना चाहते हैं, लेकिन यह आपको सही रास्ते पर रखने के लिए पर्याप्त होना चाहिए।

+0

हां, मुझे यह भी लगता है कि यदि मैं योग करता हूं और लिखता हूं तो काम करना चाहिए, लेकिन मुझे यकीन नहीं है कि अलविदा के योग को कैसे करें, प्रत्येक बाइट से बाइट निकालने के लिए कैसे करें और फिर उन्हें कैसे योग करें, यह वह चीज है जो मैं नहीं करता – luosKrad

+0

@ user679463 समझें: मैंने अपना जवाब संपादित कर लिया है, ऊपर देखें। – Unsigned

0

अगर आप असम्पीडित ऑडियो है, तो आप सिर्फ व्यक्तिगत सरणी तत्वों के मूल्यों को अपने ByteArray के में जोड़ सकते हैं। लेकिन आपको अधिकतम/न्यूनतम मानों (कोई ओवरफ्लो) के लिए कैपिंग को भी संभालना होगा। बहुत यकीन है कि एमपी 3 मिश्रण के बराबर कुछ भी नहीं है - इसलिए आपको फिर से एमपी 3 को डीकोड, मिश्रण और एन्कोड करना पड़ सकता है।

7

थोड़ी देर के लिए इसी तरह की प्रणाली पर काम कर रहा है, मैं अपने सर्वश्रेष्ठ प्रयास करेंगे आप कुछ दिशा देने के लिए:

आपका उदाहरण कोड वास्तव में मिश्रण नहीं है एमपी 3 के - यह 2 अधिक ध्वनि पैदा की जाती है लोड एमपी 3 के प्लेबैक करने के लिए SampleDataEvent के माध्यम से। आपको केवल एक "आउटपुट" ध्वनि फ़ाइल बनाना है जो परिणामी मिश्रित ध्वनि को पकड़/प्लेबैक करेगा। आप उस डेटा को आसानी से सहेज सकते हैं जैसा कि होता है और बाद में उस फ़ाइल को एक नए डब्ल्यूएवी/एमपी 3/आपके पास क्या है।

वास्तविक/छद्म-कोड (पढ़ें: आलसी):

output = new Sound(); 

output.addEventListener(SampleDataEvent.SAMPLE_DATA , mixAudio); 

song1 = new Sound/load the first mp3 

song2 = new Sound/load the second mp3 

// a byteArray for "recording" the output and subsequent file creation 
recordedBytes = new ByteArray(); 

या तो जब तक प्रतीक्षा दोनों एमपी 3 के पूरी तरह से लोड कर रहे हैं, या एक में प्रवेश फ्रेम निर्धारित करने के लिए चलते हैं तो दोनों ध्वनि बफरिंग नहीं रह रहे हैं (Sound.isBuffering)

जब एमपी 3 के लिए तैयार हैं:

// numbers to store some values 

var left1:Number; 
var right1:Number; 

var left2:Number; 
var right2:Number; 

// bytearrays for extracting and mixing 
var bytes1:ByteArray = new ByteArray(); 
var bytes2:ByteArray = new ByteArray(); 

// start the show 
output.play(); 


function mixAudio(e:SampleDataEvent):void{ 
    //set bytearray positions to 0 

    bytes1.position = 0; 
    bytes2.position = 0; 

    //extract 

    song1.extract(bytes1, 8192); 
    song2.extract(bytes2, 8192); 

    // reset bytearray positions to 0 for reading the floats 

    bytes1.position = 0; 
    bytes2.position = 0; 

    // run through all the bytes/floats 

    var b:int = 0; 

    while(b < 8192){ 

    left1 = bytes1.readFloat(); // gets "left" signal 
    right1 = bytes1.readFloat(); // gets "right" signal 

    left2 = bytes2.readFloat(); 
    right2 = bytes2.readFloat(); 


    // mix! 

    var newLeft:Number = (left1 + left2) * .5; 
    var newRight:Number = (right1 + right2) * .5; 

    // write the new stuff to the output sound's 

    e.data.writeFloat(newLeft); 
    e.data.writeFloat(newRight); 

    // write numbers to the "recording" byteArray 
    recordedBytes.writeFloat(newLeft); 
    recordedBytes.writeFloat(newRight); 

    b++; 

    } 
} 

हाँ - क्या तुम सच में संभव उत्पादन -1/1 पर टोपी चाहिए। कर दो। यह बेहद अनूठा है!

ठीक है। तो यह आसान हिस्सा है! कठिन हिस्सा वास्तव में अंतिम बाइटएरे को एमपी 3 में परिवर्तित कर रहा है। ऑडियो फ्लैश के भीतर पीसीएम/असंपीड़ित डेटा के रूप में मौजूद है, एमपी 3 स्पष्ट रूप से संकुचित प्रारूप है। यह "उत्तर" पहले से ही बहुत लंबा रास्ता है और यह सारी जानकारी मैंने कई बहुत ही स्मार्ट लोगों से प्राप्त की है।

आप आसानी से एक सामान्य ध्वनि डेटा रिकॉर्डर होने के लिए 'MicRecorder' अनुकूलित कर सकते हैं: http://www.bytearray.org/?p=1858

MP3 में कनवर्ट एक कुतिया हो जाएगा: Thibault ByteArray.org पर एक और पोस्ट है - लंगड़ा एमपी 3 के लिए खोज।

उत्कृष्ट उदाहरण/संसाधन: http://www.anttikupila.com/flash/soundfx-out-of-the-box-audio-filters-with-actionscript-3/

आंद्रे मिशेल का ओपन सोर्स गूगल कोड पर 'Tonfall' परियोजना को देखो।

केविन गोल्डस्मिथ के ब्लॉग और प्रयोगशालाओं को देखो - उन्हें इस पागलपन के साथ पिक्सेल बेंडर का उपयोग करने पर बहुत अच्छा उदाहरण मिला है।

उम्मीद है कि इससे मदद मिलती है!

पीएस - एंड्रयू से एक क्यू लेते हुए, ऑडियो बफर की इष्टतम लंबाई 3072 होनी चाहिए। इसे अपनी मशीन पर आज़माएं!

+0

हे निक, एमपी 3 को सहेजने के तरीके के बारे में सभी जानकारी के लिए धन्यवाद, मैंने एमपी 3 को कैसे सहेज लिया है, मैंने हल किया है कि fr.kikko से लाइब्रेरी के साथ https://github.com/kikko/Shine-MP3-Encoder-on -एएस 3-कीमिया मेरा अगला कदम पिक्सेल ब्लेंडर – luosKrad

+0

का उपयोग करना है माइक्रोक्रिकॉर्डर के बारे में मैंने इसे अपने पहले विकल्प के रूप में उपयोग किया और यह सुंदर काम किया लेकिन मुझे एहसास हुआ कि केवल मेरे गोद में ध्वनिबोर्ड पर एक माइक्रोफोन स्थापित है और यह एक माइक्रो के रूप में उपयोग करता है लाइन अन्य उपयोगकर्ताओं में काम नहीं करेगी इस फाइल को जांचें: http://www.grupoogl.com/beat/wav2mp3/ATR_Recorder.swf – luosKrad

+0

हे लुओसक्रैड, जब आप इस सवाल से पूछते हैं तो मुझे वही चुनौतियां मिल रही हैं, क्या आप कुछ प्रकाश साझा करते हैं। आपका अंतिम समाधान क्या था, और आप क्या हल नहीं कर सके। धन्यवाद! – GV3

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