Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Резать mp3 (http://www.flasher.ru/forum/showthread.php?t=160691)

Drabuna 16.07.2011 02:11

Резать mp3
 
Доброго времени суток.

Предположим что у нас есть mp3 файл длиной в 60 секунд, и он представлен объектом типа Sound. Нам необходимо вырезать кусок начиная с 30 секунды по 45 секунду и получить так же Sound но уже длиной 15 секунд. 2 дня убил на Sound.extract() так ничего и не получилось.

Может кто-то сталкивался с такой задачей?

3p.station 16.07.2011 11:33

вникните в этот классик(изменение скорости проигрывания трека) - его можно допилить и под вашу задачу
Код AS3:

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;
                }
 
        }
}


КорДум 16.07.2011 11:55

Немного оффтопа. Зачем вы пишете так:
Код AS3:

return(_phase);

? Это не функция.

DJDrugsounD 16.07.2011 12:03

ещё почитайте это

Aquahawk 16.07.2011 12:50

Цитата:

Сообщение от КорДум (Сообщение 1012033)
Немного оффтопа. Зачем вы пишете так:
Код AS3:

return(_phase);

? Это не функция.

Тоже поофтоплю. А зачем спрашиваете? Кодстаил такой. Мне тоже не особо нравится, но почему бы и нет. Точки с запятой вы же ставите, и я ставлю, а кто-то не ставит. Тоже необязательный элемент который закреплён в кодстайле.

Drabuna 16.07.2011 13:40

Я вникал в этот код пока гуглил. Проблема в том что SampleDataEvent диспатчится через определенное время повторно, и Sound.extract может извлечь от 2048 до 8192 образцов за раз, а мне надо извлечь сразу нужное количетсво образцов для 15 секунд, дабы мне не пришлось проигрывать 15 секунд трэка, чтобы каким то образом определить сколько раз надо вызывать extract в SampleDataEvent.

3p.station 17.07.2011 01:04

Цитата:

Сообщение от КорДум (Сообщение 1012033)
Немного оффтопа. Зачем вы пишете так:
Код AS3:

return(_phase);

? Это не функция.

да както в привычку вошло :)
знаешь(думаю можно на ты) так бывает когда развитие то происходит, но не ключевые моменты так и остаются
исправлюсь, спасибо!

КорДум 17.07.2011 01:28

Давай на "ты" =)
Я не придирался. Ловил случай развеять сомнения ;)

Drabuna 17.07.2011 20:10

Давайте по теме.

ZGG 18.07.2011 12:26

Вложений: 1
Вот нашел примерчик, можно поковырять декомпилятором. :)


Часовой пояс GMT +4, время: 03:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.