【问题标题】:embedded mp3 in actionscript3 won't play all the way throughactionscript3 中嵌入的 mp3 不会一直播放
【发布时间】:2012-01-10 17:14:03
【问题描述】:

我嵌入了一个 mp3 文件,用作我的应用程序的背景音乐。虽然它工作正常,但问题是它不会播放整个曲目,它只播放它的前 32 秒(mp3 文件是 1:30 分钟)。

这里有人知道为什么吗?

我读过here,可能声音不适合支持的 Flash 播放器声音格式,但我认为这不是问题!文件没有那么大,但也许我错了?

知道是什么导致了问题吗?或者如何解决?代码很好,我确信(它非常简单。只是嵌入了 mp3,初始化了所需的变量并播放了声音。没什么花哨的)

编辑:mp3 编码为 44100 KHz

编辑这是代码,只是以防万一

package 
{
    import flash.display.Sprite;
    import flash.media.Sound;
    import flash.media.SoundChannel;

    public class BackgroundMusic extends Sprite
    {
        [Embed(source="swfs/bg.mp3")]       
        private var BG:Class;

        public function BackgroundMusic() 
        {   
            var backgroundMusic:Sound = new BG();
            backgroundMusic.play();
        }

    }
}

【问题讨论】:

  • 您是否尝试过使用其他 mp3(只是为了确定原因)?
  • 我刚刚查过了。我从我的库中添加了一首随机歌曲,现在它根本不播放。 trace(backgroundMusic.length) 实际上给出了 0 ...这很奇怪
  • 我刚试的新mp3比原来的大(播放30的那个)。所以也许是尺寸问题?
  • 原始 mp3 文件的长度是多少?
  • 36301.49659863945,即 36 秒,播放 36 秒,而不是我所说的 30(或 32 或其他)(我的错误,我计算错误)。奇怪的是,当我刚刚切换到另一个 mp3(更大的)时,长度为 0...

标签: flash actionscript-3 audio air flash-builder


【解决方案1】:

正如上述链接所示,问题确实出在 mp3 文件本身。基本上它太大了。因此,在将其从 44kHz 立体声 32 位降低到 44kHz 立体声 16 位之后,它工作得很好,现在它一直运行。话虽如此,我们无法嵌入更高质量的 mp3 文件有点奇怪。我认为这个问题不会是加载(而不是嵌入)的问题,但我还没有测试过。如果这里有人知道如何在不降低 mp3 质量的情况下解决此问题,请分享

【讨论】:

    【解决方案2】:

    好吧,距离最初的问题已经 2 年了,但我遇到了同样的问题,但只有短(不到 2 秒)的文件。原来问题出在元数据上。如果元数据显示声音的长度为 1 秒,而实际上是 1.5 秒,则 Flash 将只播放 1 秒的声音,并切断其余的声音。

    当从wav 转换为mp3 时,我通过在文件中不包含元数据解决了这个问题。

    希望对某人有所帮助。

    【讨论】:

      【解决方案3】:

      我敢肯定,每次您让音乐播放时,它都会重新开始播放。你有可能告诉它播放几次吗?如果它总是正好 32 秒,那么我不知道,但如果它总是在同一时间,也许要注意你在那段时间在做什么,并检查你是否有可能再次调用 play() 函数。

      如果您的应用在某个地方有某种 30 秒计时器,那它肯定是有责任的。

      编辑:呵呵如果声音是整个应用程序中唯一存在的东西,那么没关系。不过还是要记住就好了。

      【讨论】:

      • 如果有帮助,我添加了代码。是的,它恰好在 32 秒处停止。我正在调用 play() 所以它只播放文件一次并且它不绑定到任何确定的计时器。
      【解决方案4】:

      您的背景声音实例可能正在被垃圾收集。因为您没有维护对它的引用。试试这个:

      package 
      {
          import flash.display.Sprite;
          import flash.media.Sound;
          import flash.media.SoundChannel;
      
          public class BackgroundMusic extends Sprite
          {
              [Embed(source="swfs/bg.mp3")]       
              private var BG:Class;
      
              private var _backgroundMusic:Sound;
      
              public function BackgroundMusic() 
              {   
                  _backgroundMusic = new BG();
                  _backgroundMusic.play();
              }
         }
      }
      

      【讨论】:

      • 我认为这不是垃圾收集问题,因为我从 backgroundMusic 调用 play()。不管我试过了,它并没有解决问题。一样,只是停在30秒。不过值得一试,无论如何谢谢 =)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多