Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Неточная длина аудио (http://www.flasher.ru/forum/showthread.php?t=206554)

helio 11.02.2014 14:26

Неточная длина аудио
 
Всем привет. У меня есть часы, вместе с которыми проигрывается музыка. Так вот в программе Audacity я вырезал длину аудио-файла с точностью до миллисекунд. Длина файла равна 59 секундам, т.е. начиная с нуля секунд по часам аудио заново воспроизводится. Только вот тут нет синхронизации аудио со временем. В приложении у меня показывает длину в миллисекундах 59088.97959183673, из-за чего происходит рассинхронизация стрелок часов и аудио, т.е. повторное воспроизведение происходит когда стрелка на часах достигла 59 секунд, затем 58 и все ниже и ниже. Аудио-файл в формате mp3. На StackOverflow было написано, что если добавить sound.play(0, 9999), то это помогает воспроизводить без зазоров, но данный метод тоже не помог.

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.TimerEvent;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.utils.Timer;
 
        public class Main extends Sprite
        {
                private var _date:Date;
                private var _timer:Timer;
                private var _hours:*;
                private var _minutes:*;
                private var _seconds:*;
                private var _sound:Sound;
                private var _soundChannel:SoundChannel;
 
                public function Main()
                {
                        _date = new Date();
                        _hours = _date.hours;
                        _minutes = _date.minutes;
                        _seconds = _date.seconds;
                        _timer = new Timer(1000);
                        _sound = new ClockSnd();
 
            // При старте перейти ко времени в соответствии с  текущей секундой.
                        _soundChannel = _sound.play(_seconds * 1000);
                        _soundChannel.addEventListener(Event.SOUND_COMPLETE, playbackCompleteHandler);
 
                        updateClock();
 
                        _timer.addEventListener(TimerEvent.TIMER, startClock);
                        _timer.start();
                }
 
                private function playSound():void
                {
                        _soundChannel = _sound.play();
                        _soundChannel.addEventListener(Event.SOUND_COMPLETE, playbackCompleteHandler);
                }
 
                private function playbackCompleteHandler(event:Event):void
                {
                        SoundChannel(event.currentTarget).removeEventListener(event.type, playbackCompleteHandler);
                        playSound();
                }
 
                private function startClock(event:TimerEvent):void
                {
                        _date = new Date();
                        _hours = _date.hours;
                        _minutes = _date.minutes;
                        _seconds = _date.seconds;
 
                        updateClock();
                }
 
                private function updateClock():void
                {
                        if (String(_minutes).length < 2)
                        {
                                _minutes = "0" + _minutes;
                        }
                        if (String(_seconds).length < 2)
                        {
                                _seconds = "0" + _seconds;
                        }
                }
        }
}


elder_Nosferatu 11.02.2014 15:28

Если синхронизация таймера и звука принципиальна, то плюньте на реальное время и выводите положение проигрывающей головки (_soundChannel.position) вместо реального времени и будет вам счастье.

helio 11.02.2014 15:52

Неужели эту проблему никак нельзя решить?

КорДум 11.02.2014 20:15

Код AS3:

private function updateClock():void
                {
                        if (String(_minutes).length < 2)
                        {
                                _minutes = "0" + _minutes;
                        }
                        if (String(_seconds).length < 2)
                        {
                                _seconds = "0" + _seconds;
                        }
                }

Таки лучше сравнивать без конвертации в стринг обычным математическим оператором "< 10".

elder_Nosferatu 11.02.2014 20:47

Цитата:

Сообщение от helio (Сообщение 1159528)
Неужели эту проблему никак нельзя решить?

А почему вы решили, что проблема в флеше и решать ее нужно на стороне флеша. Может звуковой редактор вас обману и на самом деле вы не так уж и точно обрезали свой файл. Как не крути, а цифровая инфа дискретна и не всегда порция данных закончится именно там, где вы решите поставить метку. Короче, не создавайте себе лишних препятствий.


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

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