簡體   English   中英

NLayer MpegFile轉SFML(.NET)音樂

[英]NLayer MpegFile to SFML (.NET) Music

我目前正在尋找某種方式來擴展SFML.Net以使用MP3。 因此,ioctllr推薦了NLayer,我想嘗試一下。 這是我的方法:

namespace AudioCuesheetEditor.AudioBackend
{
public class SFMLMp3Stream : Stream
{
    private static readonly Logfile log = Logfile.getLogfile(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    private MpegFile file;

    public SFMLMp3Stream(String _filename)
    {
        //TODO:Check file existence
        file = new MpegFile(_filename);
        log.debug("file = " + file.ToString());
    }

    #region implemented abstract members of Stream

    public override void Flush()
    {
        file.Position = 0;
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        switch (origin)
        {
            case SeekOrigin.Begin:
                file.Position = offset;
                break;
            case SeekOrigin.Current:
                file.Position = file.Position + offset;
                break;
            case SeekOrigin.End:
                break;
        }
        return file.Position;
    }

    public override void SetLength(long value)
    {
        //TODO?
        int i = 1;
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return file.ReadSamples(buffer, offset, count);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        throw new NotImplementedException();
    }

    public override bool CanRead
    {
        get
        {
            return true;
        }
    }

    public override bool CanSeek
    {
        get
        {
            return file.CanSeek;
        }
    }

    public override bool CanWrite
    {
        get
        {
            //Writing to stream is prohibited
            return false;
        }
    }

    public override long Length
    {
        get
        {
            return file.Length;
        }
    }

    public override long Position
    {
        get
        {
            return file.Position;
        }
        set
        {
            file.Position = value;
        }
    }

    #endregion
}

}

使用這種方式:

musicStream = new SFMLMp3Stream(this.objProgram.getObjCuesheet().getAudiofilePath(true));
                try
                {
                    music = new Music(musicStream);
                }
                catch(Exception ex)
                {
                    log.fatal(ex.ToString());
                }

我從SFML獲得異常:

05.06.2014 10:34:28 AudioCuesheetEditor.AudioBackend.AudioManagerSFML: FATAL |    SFML.LoadingFailedException: Failed to load music from memory
bei SFML.Audio.Music..ctor(Stream stream)
bei AudioCuesheetEditor.AudioBackend.AudioManagerSFML.setMusic() in d:\tmp\AudioCuesheetEditor\src\AudioCuesheetEditor\AudioBackend\AudioManagerSFML.cs:Zeile 50.

我在SFML中讀到,它需要PCM 16位帶符號整數( http://en.sfml-dev.org/forums/index.php?topic=1406.0 )。 NLayer支持嗎? 我該如何更改代碼,使其有效?

謝謝你的幫助。 斯文

Unhappiliy Music類不提供閱讀mp3流的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM