<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Just Developer Blog, заметки с тегом: How to play mp3 programmatically in iOS</title>
<link>http://bibobo.ru/tags/how-to-play-mp3-programmatically/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Работа с AVAudioPlayer и MPNowPlayingInfo (iOS)</title>
<guid isPermaLink="true">http://bibobo.ru/all/rabota-s-avaudioplayer-i-mpnowplayinginfo-ios/</guid>
<link>http://bibobo.ru/all/rabota-s-avaudioplayer-i-mpnowplayinginfo-ios/</link>
<comments>http://bibobo.ru/all/rabota-s-avaudioplayer-i-mpnowplayinginfo-ios/</comments>
<description>&lt;p&gt;В ходе разработки приложений под iOS часто возникает необходимость проиграть аудио-файл, например композицию или эффект. Наиболее простым способом для этого в iOS является использование класса AVAudioPlayer. Он является частью фреймворка AVFoundation, так что нам потребуется поставить на него using.&lt;/p&gt;
&lt;p&gt;Ниже представлен код хэлпера, упрощающего работу с этим классом.&lt;/p&gt;
&lt;p&gt;&lt;input id="button_ios_avaudioplayer" type="button" onclick="toggle(cut_ios_avaudioplayer, button_ios_avaudioplayer)" value="Читать дальше" hiddenText="Свернуть" visibleText="Читать дальше"&gt;&lt;/p&gt;
&lt;div id="cut_ios_avaudioplayer" style="display: none;" displayOld=""&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// Хэлпер, упрощающий работу с плейером (в системе всегда висит один статический плейер)
/// &amp;lt;/summary&amp;gt;
public static class PlayerHelper
{
    /// &amp;lt;summary&amp;gt;
    /// Состояние плейера
    /// &amp;lt;/summary&amp;gt;
    public enum PlayerState
    {
        Uncknown,
        Playing,
        Stopped,
        Paused
    }

    /// &amp;lt;summary&amp;gt;
    /// Состояние плейера
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;value&amp;gt;The state.&amp;lt;/value&amp;gt;
    public static PlayerState State { get; private set; }

    private static AVAudioPlayer _player;
    public static AVAudioPlayer Player { get{ return _player; } }

    /// &amp;lt;summary&amp;gt;
    /// Включена или нет функция зацикливания
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;value&amp;gt;&amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if is infinite playing; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;.&amp;lt;/value&amp;gt;
    public static bool IsInfinitePlaying
    {
        get{ return _player != null ? _player.NumberOfLoops == int.MaxValue : false; }
        set
        {
            if (_player == null)
            {
                return;
            }

            _player.NumberOfLoops = value ? int.MaxValue : 0;
        }
    }

    static PlayerHelper()
    {
        State = PlayerState.Uncknown;
    }

    /// &amp;lt;summary&amp;gt;
    /// Проиграть URL с диска (если он уже проигрывается, воспроизведение продолжится с места остановки)
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;returns&amp;gt;The URL.&amp;lt;/returns&amp;gt;
    /// &amp;lt;param name=&amp;quot;url&amp;quot;&amp;gt;URL.&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&amp;quot;finishedPlayingAction&amp;quot;&amp;gt;Finished playing action.&amp;lt;/param&amp;gt;
    public static AVAudioPlayer PlayUrl(NSUrl url, Action finishedPlayingAction = null)
    {
        //в тех случаях, когда плейер уже проигрывает переданный url - не нужно останавливать запись или начинать сначала
        if (IsPlayerLoadedThisFile(url))
        {
            ResumePlaying();
            return _player;
        }

        StopPlaying();

        _player = AVAudioPlayer.FromUrl(url);
        _player.CurrentTime = 0;
        _player.Volume = 1f;

        if (finishedPlayingAction != null)
        {
            _player.FinishedPlaying += (sender, e) =&amp;gt;
            {
                finishedPlayingAction.Invoke();
            };
        }

        _player.PrepareToPlay();

        //разрешаем проигрывание в бекграунде
        AVAudioSession.SharedInstance().SetCategory(AVAudioSessionCategory.Playback);
        AVAudioSession.SharedInstance().SetActive(true);
        UIApplication.SharedApplication.BeginReceivingRemoteControlEvents();

        _player.Play();

        State = PlayerState.Playing;

        return _player;
    }

    /// &amp;lt;summary&amp;gt;
    /// Проиграть
    /// &amp;lt;/summary&amp;gt;
    public static void Play()
    {
        if (_player == null)
        {
            return;
        }

        _player.Play();
        State = PlayerState.Playing;
    }

    /// &amp;lt;summary&amp;gt;
    /// Остановить
    /// &amp;lt;/summary&amp;gt;
    public static void StopPlaying()
    {
        if (_player == null)
        {
            return;
        }

        _player.Stop();
        State = PlayerState.Stopped;
    }

    /// &amp;lt;summary&amp;gt;
    /// Приостановить
    /// &amp;lt;/summary&amp;gt;
    public static void PausePlaying()
    {
        if (_player == null)
        {
            return;
        }

        _player.Pause();
        State = PlayerState.Paused;
    }

    /// &amp;lt;summary&amp;gt;
    /// Продолжить
    /// &amp;lt;/summary&amp;gt;
    public static void ResumePlaying()
    {
        if (_player == null)
        {
            return;
        }

        _player.Play();
        State = PlayerState.Playing;
    }

    /// &amp;lt;summary&amp;gt;
    /// Возвратит true, если плейер загрузил файл по этому URL с диска
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;returns&amp;gt;&amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if is player loaded this file the specified url; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;.&amp;lt;/returns&amp;gt;
    /// &amp;lt;param name=&amp;quot;url&amp;quot;&amp;gt;URL.&amp;lt;/param&amp;gt;
    public static bool IsPlayerLoadedThisFile(NSUrl url)
    {
        if (_player == null)
        {
            return false;
        }

        return _player.Url.LastPathComponent == url.LastPathComponent;
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/br&gt;&lt;/p&gt;
&lt;p&gt;Так же при проигрывании композиции (если в info.plist прописано разрешение на проигрывание аудио в бекграунде) на главном экране отображается информация о композиции, а так же кнопки управления воспроизведением. Чтобы информация отображалась корректно необходимо при старте проигрывания трека написать следующий код:&lt;/p&gt;
&lt;p&gt;&lt;/br&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;MPNowPlayingInfo info = new MPNowPlayingInfo();
info.Title = &amp;quot;Имя композиции&amp;quot;;
info.Artist = &amp;quot;наименование артиста&amp;quot;;

info.PlaybackRate = 1f;
info.PlaybackDuration = PlayerHelper.Player.Duration;
info.ElapsedPlaybackTime = PlayerHelper.Player.CurrentTime;

MPNowPlayingInfoCenter.DefaultCenter.NowPlaying = info;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
<pubDate>Mon, 18 Jan 2016 23:11:20 +0300</pubDate>
</item>


</channel>
</rss>