|
|
|||||
Регистрация: Jun 2009
Сообщений: 40
|
Резать mp3
Доброго времени суток.
Предположим что у нас есть mp3 файл длиной в 60 секунд, и он представлен объектом типа Sound. Нам необходимо вырезать кусок начиная с 30 секунды по 45 секунду и получить так же Sound но уже длиной 15 секунд. 2 дня убил на Sound.extract() так ничего и не получилось. Может кто-то сталкивался с такой задачей? |
|
|||||
вникните в этот классик(изменение скорости проигрывания трека) - его можно допилить и под вашу задачу
package audio { import flash.events.Event; import flash.events.SampleDataEvent; import flash.media.Sound; import flash.net.URLRequest; import flash.utils.ByteArray; public class Audio { private var _sound:Sound; private var _playbackSpeed:Number = 1; private var _mp3:Sound; private var _loadedMP3Samples:ByteArray; private var _dynamicSound:Sound; private var _phase:Number; private var _numSamples:int; public function Audio() { } public function play():void { var bytes:ByteArray = new ByteArray(); _sound.extract(bytes, int(_sound.length * 44.1)); playBytes(bytes); } private function playBytes(bytes:ByteArray):void { stop(); _dynamicSound = new Sound(); _dynamicSound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); _loadedMP3Samples = bytes; _numSamples = bytes.length / 8; _phase = 0; _dynamicSound.play(); } private function onSampleData( event:SampleDataEvent ):void { var l:Number; var r:Number; var outputLength:int = 0; while (outputLength < 2048) { // until we have filled up enough output buffer // move to the correct location in our loaded samples ByteArray _loadedMP3Samples.position = int(_phase) * 8; // 4 bytes per float and two channels so the actual position in the ByteArray is a factor of 8 bigger than the phase // read out the left and right channels at this position l = _loadedMP3Samples.readFloat(); r = _loadedMP3Samples.readFloat(); // write the samples to our output buffer event.data.writeFloat(l); event.data.writeFloat(r); outputLength++; // advance the phase by the speed... _phase += _playbackSpeed; // and deal with looping (including looping back past the beginning when playing in reverse) if (_phase < 0) { _phase += _numSamples; } else if (_phase >= _numSamples) { _phase -= _numSamples; } } } public function set playbackSpeed(value:Number):void { _playbackSpeed = value; } public function stop():void { if (_dynamicSound) { _dynamicSound.removeEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); _dynamicSound = null; } } public function get sound():Sound { return(_sound); } public function set sound(value:Sound):void { _sound = value; } public function get phase():Number { return(_phase); } public function set phase(value:Number):void { _phase = value; } } }
__________________
мира и гармонии |
|
|||||
Тоже поофтоплю. А зачем спрашиваете? Кодстаил такой. Мне тоже не особо нравится, но почему бы и нет. Точки с запятой вы же ставите, и я ставлю, а кто-то не ставит. Тоже необязательный элемент который закреплён в кодстайле.
|
|
|||||
Регистрация: Jun 2009
Сообщений: 40
|
Я вникал в этот код пока гуглил. Проблема в том что SampleDataEvent диспатчится через определенное время повторно, и Sound.extract может извлечь от 2048 до 8192 образцов за раз, а мне надо извлечь сразу нужное количетсво образцов для 15 секунд, дабы мне не пришлось проигрывать 15 секунд трэка, чтобы каким то образом определить сколько раз надо вызывать extract в SampleDataEvent.
|
|
|||||
Цитата:
знаешь(думаю можно на ты) так бывает когда развитие то происходит, но не ключевые моменты так и остаются исправлюсь, спасибо!
__________________
мира и гармонии Последний раз редактировалось 3p.station; 17.07.2011 в 01:07. |
|
|||||
Регистрация: Jun 2009
Сообщений: 40
|
Давайте по теме.
|
|
|||||
Вот нашел примерчик, можно поковырять декомпилятором.
__________________
ЛОГИКА - залог программирования! |
Часовой пояс GMT +4, время: 22:47. |
|
« Предыдущая тема | Следующая тема » |
|
|