Red de conocimiento informático - Material del sitio web - Cómo reproducir audio de fondo en Windows Phone

Cómo reproducir audio de fondo en Windows Phone

Este tema muestra cómo crear una aplicación de Windows Phone para Windows Phone 7.5 que continúe reproduciendo audio incluso cuando la aplicación ya no se esté ejecutando en primer plano. Hay dos tipos de aplicaciones de audio de fondo. Uno reproduce medios locales y el otro reproduce medios de transmisión. Este artículo describe cómo implementar una aplicación de Windows Phone que utiliza un proxy de reproducción de audio para reproducir medios locales.

Consejo:

Para obtener una descripción arquitectónica de la aplicación de audio de fondo, consulte Descripción general del audio de fondo para Windows Phone. Esta descripción general también incluye las mejores prácticas a seguir al implementar su aplicación.

Cómo reproducir audio de fondo

Para reproducir audio de fondo, cree un "Audio de Windows Phone" en Visual Studio usando la plantilla de proyecto Silverlight para Windows Phone Play Agente". Luego, haga referencia al proxy en segundo plano de su aplicación.

Consejo:

Para obtener más información sobre la reproducción de audio de fondo en aplicaciones de Windows Phone, descargue el ejemplo de Reproductor de audio de fondo y Audio de fondo desde la página de ejemplos de código para el ejemplo de Streamer de Windows Phone.

Nota importante:

Este artículo requiere el uso del SDK de Windows Phone. Consulte Instalación del SDK de Windows Phone.

Crea una aplicación de audio de fondo para Windows Phone

Crea un nuevo proyecto seleccionando el comando de menú "Archivo | Nuevo proyecto...".

Aparecerá el cuadro de diálogo Nuevo proyecto. Expanda la plantilla "Visual C#" y seleccione la plantilla "Silverlight para Windows Phone".

Selecciona la plantilla "Aplicación Windows Phone". Complete el Nombre según sea necesario y haga clic en Aceptar.

Seleccione Windows Phone 7.1 como versión de destino y haga clic en Aceptar.

En el Explorador de soluciones, haga clic derecho en el nodo Soluciones y seleccione Agregar | Nuevo proyecto....

En el cuadro de diálogo Agregar nuevo elemento, haga clic en Agente de reproducción de audio de Windows Phone.

Rellene el Nombre según sea necesario y haga clic en Aceptar.

Su solución ahora debería tener dos proyectos, el proyecto de aplicación y el proyecto de agente en segundo plano.

En el cuadro de diálogo Agregar referencia, haga clic en la pestaña Proyecto. Seleccione el proxy backend que creamos anteriormente y haga clic en Aceptar.

Agregar archivos de audio

En el Explorador de soluciones, haga clic derecho en el proyecto de la aplicación y seleccione Agregar nueva carpeta. Nombra la carpeta Audio.

Haga clic derecho en la carpeta Audio que acaba de crear y seleccione "Agregar | Elemento existente..." en el menú contextual.

En el cuadro de diálogo Agregar elemento existente, navegue hasta "%PUBLIC%\Music\Sample Music" (generalmente C:\Users\Public\Music\Sample Music) y seleccione varios documentos de audio. Para obtener información sobre los formatos de archivo admitidos por el reproductor de audio de fondo, consulte Códecs multimedia compatibles con Windows Phone.

Haga clic en el botón "Agregar".

En el Explorador de soluciones, seleccione todos los archivos de audio que acaba de agregar en el directorio Audio. En el panel Propiedades, cambie el campo Copiar al directorio de salida de "No copiar" a "Copiar si es más nuevo".

Crear interfaz de usuario

La aplicación tiene una interfaz de usuario muy sencilla.

En el Explorador de soluciones, haga doble clic en MainPage.xaml para abrirlo en el Diseñador/Editor XAML.

Reemplace el elemento StackPanel llamado TitlePanel con el siguiente código XAML:

3. Reemplace el elemento Grid llamado ContentPanel con este código XAML:

¿StackPanel? Elemento muy conveniente para organizar botones. En este ejemplo, organizamos los botones horizontalmente configurando la propiedad Orientación en consecuencia.

4. La interfaz de usuario en el diseñador debería verse así:

Modifique el archivo de código subyacente de la interfaz de usuario

En "Explorador de soluciones", Haga clic derecho en "MainPage.xaml" y seleccione Ver código en el menú contextual.

Agregue la siguiente instrucción ?using? en la parte superior del archivo MainPage.xaml.cs:

C#

using System.Windows.Navigation;

usando Microsoft.Phone.BackgroundAudio;

Agregue el siguiente código de controlador de eventos de clic de botón a la clase MainPage en MainPage.xaml.cs:

C#

#region Controladores de eventos de clic de botón

private void prevButton_Click(remitente del objeto, RoutedEventArgs e)

{

BackgroundAudioPlayer.Instance.SkipPrevious();

}

privado void playButton_Click(objeto remitente, RoutedEventArgs e)

{

if (PlayState.Playing == BackgroundAudioPlayer.Instance. PlayerState)

{

BackgroundAudioPlayer.Instance.Pause();

}

else

{

BackgroundAudioPlayer.Instance.Play();

}

}

private void nextButton_Click(remitente del objeto, RoutedEventArgs e)

{

BackgroundAudioPlayer.Instance.SkipNext();

}

#endregion Controladores de eventos de clic de botón

Tenga en cuenta , el controlador playButton_Click? en realidad cambia entre reproducción y pausa según el estado actual de reproducción.

En el constructor de la clase MainPage, agregue un controlador de eventos para el evento PlayStateChanged.

C#

BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged);

Implemente el método ?Instance_PlayStateChanged de la siguiente manera:

C#

void Instance_PlayStateChanged(remitente del objeto, EventArgs e)

{

interruptor (BackgroundAudioPlayer.Instance.PlayerState)

{

?case PlayState.Playing:

playButton.Content = "pausa";

pausa;

?case PlayState.Paused:

?case PlayState.Stopped:

playButton.Content = "reproducir";

pausa;

}

if (null != BackgroundAudioPlayer.Instance.Track)

{

?txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title +

" por " +

BackgroundAudioPlayer.Instance.Track.Artist;

}

}

Dado que la aplicación está diseñada para reproducir audio en segundo plano , Por lo que el usuario podrá volver a la aplicación mientras se reproduce el audio. La interfaz de usuario debe mostrar este contenido actualizándose en consecuencia para reflejar el estado actual de reproducción y la pista que se está reproduciendo actualmente.

Para actualizar la interfaz de usuario cuando se carga la aplicación, anule el método virtual OnNavigatedTo agregando el siguiente código a la clase MainPage en MainPage.xaml.cs:

C#

protected override void OnNavigatedTo (NavigationEventArgs e)

{

if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState)

{

playButton.Content = "pausa";

txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title +

" por " +

BackgroundAudioPlayer.Instance.Track .Artist;

}

else

{

playButton.Content = "reproducir";

txtCurrentTrack .Text = "";

}

}

En el Explorador de soluciones, haga clic derecho en App.xaml y seleccione Seleccionar "Ver código" en el menú contextual.

Agregue la siguiente instrucción ?using? a App.xaml.cs:

C#

using System.IO.IsolatedStorage;

usando System.Windows.Resources;

BackgroundAudioPlayer? solo puede reproducir archivos en almacenamiento independiente o URI remoto. Agregue el siguiente método a la clase App. Asegúrese de que la matriz de archivos contenga los nombres reales de los archivos de audio que agregó al proyecto.

C#

vacío privado CopyToIsolatedStorage()

{

usando (almacenamiento IsolatedStorageFile = InsulatedStorageFile.GetUserStoreForApplication())

{

string[] files = new string[] { "Kalimba.mp3", "La criada del cabello rubio.mp3", "Sleep Away.mp3" };

foreach (var _fileName en archivos)

{

if (!storage.FileExists(_fileName))

{

cadena _filePath = "Audio/" + _fileName;

recurso StreamResourceInfo = Application.GetResourceStream(new Uri(_filePath, UriKind.Relative));

usando (archivo IsolatedStorageFileStream = almacenamiento.CreateFile( _fileName))

{

int chunkSize = 4096;

byte[] bytes = nuevo byte[chunkSize];

int byteCount ;

while ((byteCount = recurso.Stream.Read(bytes, 0, chunkSize)) > 0)

{

archivo.Write(bytes, 0, byteCount);

}

}

}

}

}

}

Agregue una llamada al método CopyToIsolatedStorage al constructor de la clase App.

C#

// Copiar medios a un almacenamiento aislado.

CopyToIsolatedStorage();

¿Se utiliza AudioPlayerAgent cuando el usuario cambia a? otras interfaces La aplicación continúa ejecutándose como parte de la aplicación en segundo plano.

Implementación del proxy del reproductor de audio

En el Explorador de soluciones, haga doble clic en AudioPlayer.cs en el proyecto proxy para abrir el archivo en el editor de código.

Agregue la siguiente declaración ?using? en la parte superior de AudioPlayer.cs:

C#

using System.Collections.Generic;

En En la clase AudioPlayer del archivo AudioPlayer.cs, declare un entero estático en el nivel de alcance de la clase. Esta variable contiene el número de pista actual.

C#

// ¿Cuál es la pista actual?

static int currentTrackNumber = 0;

Pasando ?AudioPlayer a AudioPlayer. cs ?Agregue el siguiente código a la clase para crear una lista estática de pistas:

C#

// Una lista de reproducción compuesta por elementos AudioTrack.

privada Lista estática _playList = nueva Lista

{

nueva AudioTrack(nueva Uri("Kalimba.mp3", UriKind.Relative),

"Kalimba",

"Mr. Scruff",

"Ninja Tuna",

null),

nueva AudioTrack( new Uri("La doncella del cabello rubio.mp3", UriKind.Relative),

"La doncella del cabello rubio",

"Richard Stoltzman",

"Fine Music, Vol. 1",

null),

new AudioTrack(new Uri("Sleep Away.mp3", UriKind.Relative),

"Duerme lejos",

"Bob Acri",

"Bob Acri",

null),

/ / Un URI remoto

new AudioTrack(new Uri("/wpradio/WPRadio_29.mp3", UriKind.Absolute),

"Episodio 29",

"Windows Phone Radio" ,

"Windows Phone Radio Podcast",

null)

};

Porque la lista está declarada en el alcance de la clase, así que asegúrese de especificarlo como estático para que la lista no se vuelva a crear cada vez que se llame a nuestro agente.

Para controlar las acciones del usuario, como hacer clic en los botones Reproducir, Siguiente y Anterior, agregue los siguientes tres métodos a la clase AudioPlayer en AudioPlayer.cs:

C#

privado void PlayNextTrack(reproductor BackgroundAudioPlayer)

{

if (++currentTrackNumber >= _playList.Count)

{

currentTrackNumber = 0;

}

PlayTrack(jugador);

}

privado void PlayPreviousTrack(reproductor BackgroundAudioPlayer)

{

if (--currentTrackNumber < 0)

{

currentTrackNumber = _playList Count - 1;

. }

PlayTrack(reproductor);

}

privado void PlayTrack(reproductor BackgroundAudioPlayer)

{

// Establece la pista para reproducir Cuando se recibe el estado TrackReady,

// la reproducción comienza desde el controlador OnPlayStateChanged.

player .Track = _playList[currentTrackNumber];

}

Para manejar los cambios de estado de reproducción, agregue la siguiente instrucción de cambio al método OnPlayStateChanged en la llamada a NotifyComplete antes de llamar:

C#

switch (playState)

{

?case PlayState.TrackReady:

// La pista a reproducir se establece en el método PlayTrack.

player.Play();

descanso;

?case PlayState.TrackEnded:

PlayNextTrack(jugador);

descanso ;

}

Para manejar las acciones del usuario, agregue lo siguiente a la instrucción switch? del método ?OnUserAction?, colocada antes de la llamada a ?NotifyComplete?:

C#

cambiar (acción)

{

?case UserAction.Play:

PlayTrack(jugador);

descanso;

?case UserAction.Pause:

player.Pause() ;

descanso;

?case UserAction .SkipPrevious:

PlayPreviousTrack(jugador);

descanso;

?case UserAction.SkipNext:

PlayNextTrack(jugador);

descanso;

}

Este es todo el código necesario para implementar una aplicación muy básica que reproduce audio en segundo plano. La aplicación se ejecutará desde la pantalla de bloqueo y el Control de volumen universal (UVC) puede incluso controlar la reproducción desde la aplicación. Por supuesto, también puede implementar más funciones, como una interfaz de usuario más rica, soporte para reproducir audio desde fuentes remotas utilizando el URI web del archivo de audio y más. Aún no hemos implementado soporte para operaciones de usuario como detener, avanzar rápido, rebobinar y buscar.

上篇: Cómo abordar la contradicción entre estandarización y eficiencia (Parte 1) Las normas son el alma de la contratación pública, y la eficiencia es la vida de la contratación pública. Mejorar continuamente la eficiencia de la contratación pública sobre la base de estándares. En la actualidad, debemos centrarnos en hacer un buen trabajo en todos los aspectos de la contratación pública. Estandarizar y perfeccionar los presupuestos de adquisiciones y mejorar el sistema de pago centralizado. El informe del XVII Congreso Nacional del Partido Comunista de China propuso que el trabajo financiero debería "profundizar la reforma del sistema presupuestario y fortalecer la gestión presupuestaria". Para ello, es necesario hacer un buen trabajo en materia de contratación pública: preparar presupuestos de contratación pública y fortalecer las restricciones a las adquisiciones. El presupuesto de adquisiciones gubernamentales es una parte importante del presupuesto fiscal y es una mejora y un complemento del presupuesto fiscal. En los últimos años, con la implementación integral de la reforma presupuestaria departamental, nuestra ciudad ha implementado de manera integral la preparación de presupuestos de adquisiciones gubernamentales. A través del presupuesto de adquisiciones gubernamentales, podemos predecir la escala anual de adquisiciones con anticipación, formular planes de adquisiciones, comprender las condiciones del mercado de antemano, capturar información sobre adquisiciones y organizar la implementación de acuerdo con el plan de adquisiciones, superando las deficiencias de estar ocupados con adquisiciones esporádicas o no planificadas. adquisiciones en operaciones reales y ayudar a mejorar la eficiencia del trabajo. Una vez que se determine el presupuesto de contratación pública, en principio no se realizarán modificaciones ni ajustes importantes para mantener la seriedad del presupuesto de contratación pública. Estandarizar y perfeccionar los presupuestos de adquisiciones gubernamentales y revisar y aprobar estrictamente los planes de adquisiciones. Reducir las compras innecesarias desde el origen. El presupuesto de adquisiciones gubernamentales debe organizarse, prepararse, revisarse y aprobarse de manera unificada con el presupuesto departamental. Al formular el presupuesto de adquisiciones gubernamentales, las partidas presupuestarias, el monto del fondo de adquisiciones, la composición del fondo de adquisiciones, las partidas de adquisiciones, la cantidad de adquisiciones y las normas de adquisiciones. y se enumerará el tiempo de adquisición, etc., y se implementará el proyecto para cada objeto de adquisición. Al implementar tareas de adquisiciones, todas las partes deben revisar activamente la viabilidad de las adquisiciones, eliminar las adquisiciones incomparables e innecesarias y utilizar los fondos limitados de manera inteligente. En la práctica de adquisiciones, muchas unidades tienen el fenómeno de adquisiciones ciegas que "exceden el estándar" e "insuficientes". Algunos artículos se asignan con anticipación, algunos están desactualizados y son incompatibles con las condiciones existentes; algunas adquisiciones pueden estar inactivas durante un tiempo; mucho tiempo, o Las compras prematuras y excesivas desperdician mucho dinero. Por lo tanto, es necesario determinar científicamente qué artículos deben comprar los compradores y cuánto deben gastar para resolver el problema de "qué no se debe comprar y cuánto se debe comprar". Los compradores no pueden aumentar los gastos de adquisiciones ni cambiar los elementos de las adquisiciones a voluntad. Si es realmente necesario ajustar el plan de adquisiciones gubernamentales, éste debe presentarse para su aprobación de conformidad con los procedimientos legales. Ampliar aún más el alcance del pago centralizado. Cuando el tesoro paga las adquisiciones de manera centralizada, debe centrarse en verificar si los elementos de la adquisición se utilizan de acuerdo con los fines prescritos y si exceden el presupuesto. Para aquellos que no cumplen con las regulaciones y compran sin autorización, los fondos serán. decididamente no desembolsarse. (2) Estandarizar y ampliar los canales de información sobre adquisiciones gubernamentales para lograr el máximo intercambio e integración de recursos En las adquisiciones gubernamentales, aprovechar plenamente los recursos de información y obtener información sobre adquisiciones fluida y eficaz puede garantizar la eficiencia de las actividades de adquisiciones. Mejorar la plataforma de servicios de información sobre adquisiciones gubernamentales. En nuestra ciudad, la Red de Información Pública Financiera de Nantong y la Red de Contratación Pública de Nantong son ventanas para que los proveedores obtengan información sobre adquisiciones y participen en una competencia justa en la contratación pública. Para brindar un mejor servicio a las partes encargadas de la contratación pública, se deben hacer esfuerzos para convertir la Red de Contratación Gubernamental de Nantong en un sitio web que brinde servicios integrales a los compradores, un sitio web de información que proporcione a los proveedores consultas sobre demandas de adquisiciones y un sitio web público que proporcione supervisión para todos. sectores de la sociedad, a fin de mejorar la equidad, puntualidad y transparencia de la información sobre adquisiciones gubernamentales de la ciudad. Hacer todo lo posible para cambiar las actividades de adquisiciones aisladas de provincias, ciudades y condados (distritos) y lograr vínculos mutuos. La solidez técnica de adquisiciones y los recursos del mercado se comparten ****, lo que da pleno juego a las funciones de mercado relativamente desarrolladas de la ciudad central e impulsa a las áreas circundantes a establecer sistemas de colaboración de adquisiciones conjuntas verticales y de adquisiciones conjuntas horizontales. Esto no sólo puede aprovechar al máximo el efecto de escala de la contratación pública, ahorrar costos y mejorar la utilización del capital, sino también depender de los mercados desarrollados para facilitar que los proveedores elijan participar. Los canales de información fluidos y la unificación de los recursos del mercado pueden mejorar en gran medida la eficiencia de la contratación pública. (3) Simplificar los procedimientos de servicio y establecer instituciones internas de acuerdo con los procesos comerciales. Los "Puntos de trabajo de adquisiciones del gobierno provincial de Jiangsu de 2007" del Departamento Provincial de Finanzas exigen "simplificar los procesos de adquisiciones y los procedimientos de servicios y reducir los vínculos innecesarios de aprobación de la gestión". Para ello, establecer un proceso unificado de adquisiciones gubernamentales: incluyendo el establecimiento de procesos de trabajo de adquisiciones gubernamentales, procesos de planificación, procesos de licitación, procesos de otros métodos de adquisiciones, procesos de capital, etc., e incorporarlos a la gestión de la información. El centro de adquisiciones gubernamentales debe optimizar su estructura organizativa interna y establecer un mecanismo de trabajo interno sólido y eficiente. 下篇: Cómo depurar scripts en Windows PowerShell ISE