Dalerico Ответов: 2

Как написать код для потоковой передачи mp3 файлов с помощью сервиса WCF C#


Всем привет,

Недавно я создал музыкальное приложение wcf service c# для прослушивания и загрузки музыкальных треков для потребления данных для фронтального приложения потоковой передачи музыки Android. Все работает хорошо принять производительность ожидания музыкального запроса, чтобы закончить буферизацию всего трека с сервера, чтобы ответить обратно клиенту (Android-приложение). Прежде всего, и для большинства я очень новичок в потоковых классах и концепции того, какой из них даст мне лучшую производительность для потоковой передачи mp3-файлов на веб-сервере (IIS).

Ниже приведен мой код, который я в настоящее время использую для своего музыкального mp3-файла. Может ли кто-нибудь помочь мне выбрать класс approciate Stream (FileStream, BinaryStream и т. д.) и показать мне пример. Ваша помощь будет с радостью оценена.

Что я уже пробовал:

My data contract is simply this:
[DataMember] public string TrackUrl { get; set; } 

My service contract:

[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "GET", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, UriTemplate = "LoadTracksByAlbum/{AlbumID}")]
List<LoadAlbumTracks> LoadTracksByAlbum(string AlbumID); 

My  proxy operation contract method implementation:

public List<LoadAlbumTracks> LoadTracksByAlbum(string AlbumID)
        {
            List<LoadAlbumTracks> loadAlbumTracksList1 = new List<LoadAlbumTracks>();
            MusicDataContext tapesDataContext = new MusicDataContext();
            CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-US");
            tapesDataContext.CommandTimeout = 0;
            foreach (proc_TracksLoadByAlbumResult loadByAlbumResult in (IEnumerable<proc_TracksLoadByAlbumResult>)tapesDataContext.proc_TracksLoadByAlbum(new int?(Convert.ToInt32(AlbumID))))
            {
                List<LoadAlbumTracks> loadAlbumTracksList2 = loadAlbumTracksList1;
                LoadAlbumTracks loadAlbumTracks1 = new LoadAlbumTracks();
                loadAlbumTracks1.TrackID = loadByAlbumResult.TrackID;
                loadAlbumTracks1.TrackTitle = loadByAlbumResult.TrackTitle;
                loadAlbumTracks1.Artists = loadByAlbumResult.Atists;
                loadAlbumTracks1.DiscJockeyName = loadByAlbumResult.DiscJockeyName;
                loadAlbumTracks1.TrackDescription = loadByAlbumResult.TrackDescription;
                loadAlbumTracks1.TrackUrl = loadByAlbumResult.TrackUrl;
                loadAlbumTracks1.AlbumID = loadByAlbumResult.AlbumID ?? 0;
                loadAlbumTracks1.AlbumCoverPhotoUrl = loadByAlbumResult.AlbumCoverPhotoUrl;
                loadAlbumTracks1.AlbumName = loadByAlbumResult.AlbumName;
                loadAlbumTracks1.TotalStreams = loadByAlbumResult.TotalStreams;
                LoadAlbumTracks loadAlbumTracks2 = loadAlbumTracks1;
                loadAlbumTracks1.DownloadStatus = loadByAlbumResult.DownloadStatus; 
                bool? trackStatus = loadByAlbumResult.TrackStatus;
                int num = trackStatus.HasValue ? (trackStatus.GetValueOrDefault() ? 1 : 0) : 1;
                loadAlbumTracks2.TrackStatus = num != 0;
                loadAlbumTracks1.DjID = loadByAlbumResult.DjID ?? 0;
                loadAlbumTracks1.CreatedBy = loadByAlbumResult.CreatedBy ?? 0;
                loadAlbumTracks1.CreatedOn = !loadByAlbumResult.CreatedOn.HasValue ? "" : loadByAlbumResult.CreatedOn.Value.ToString("d", (IFormatProvider)cultureInfo);
                loadAlbumTracks1.UpdatedBy = loadByAlbumResult.UpdatedBy ?? 0;
                loadAlbumTracks1.UpdatedOn = !loadByAlbumResult.UpdatedOn.HasValue ? "" : loadByAlbumResult.UpdatedOn.Value.ToString("d", (IFormatProvider)cultureInfo);
                LoadAlbumTracks loadAlbumTracks3 = loadAlbumTracks1;
                loadAlbumTracksList2.Add(loadAlbumTracks3);
            }
            return loadAlbumTracksList1;
        }

Gerry Schmitz

Обзаведитесь собственной волоконно-оптической магистралью.

2 Ответов

Рейтинг:
2

MadMyche

IIS лучше всего использовать как веб - сервер, использующий протокол HTTP, который работает в режиме загрузки, а затем рендеринга; а не как потоковый медиа-сервер, который будет использовать RTSP (real time streaming protocol) - самоочевидно нарочно.

Версии Windows до Win 7 поддерживали Windows Media Encoder, который мог перекодировать файлы в медиа-потоки для ограниченного количества (<5) клиентов. Это было заменено MS Expression Encoder; который я не использовал.
Был также пакет Windows Media Server, который мог обрабатывать гораздо большие клиентские нагрузки.

Я не знаю, что лучше всего работает в наши дни, так как это больше не входит в мою сферу деятельности; возможно, вы могли бы использовать/расширить возможности DLNA-сервера, которые теперь являются родными для Windows.

Простой поиск "C# DLNA" дает как предложения для серверов, так и для клиентов, так что это может быть жизнеспособным методом для вас


Dalerico

Спасибо за ответ, но я не совсем ясно сформулировал свой вопрос, как следовало бы. Пожалуйста, позвольте мне повторить мой вопрос. Не могли бы вы показать мне пример того, как я мог бы скрыть приведенный выше код для потоковой передачи для этого конкретного контракта IService?

Пример: буферный режим - список<loadalbumtracks&ГТ; LoadTracksByAlbum(строка AlbumID); против потока режим список<поток&ГТ; LoadTracksByAlbum(строка AlbumID);

Есть ли у вас какие-либо идеи, как я мог бы реализовать вышеупомянутый прокси-сервис (метод LoadTracksByAlbum), чтобы обернуть свойство TrackUrl для потоковой передачи mp3-файла. Свойство TrackUrl, которое находится в инструкции foreach, указывает путь к mp3 - файлу в базе данных SQL Server. И это свойство в основном получает путь к музыкальному mp3 индивидуально и извлекает фактический файл из папки, расположенной на веб-сервере приложения.

MadMyche

Извините, не могу. Я уже много лет не работаю с потоковыми медиа; то, что у меня есть, больше не жизнеспособно из-за эволюции ландшафта.

Dalerico

Ладно, тогда все равно спасибо за ваш ответ.

Рейтинг:
1

Richard MacCutchan

Цитата:
какой из них даст мне наилучшую производительность для потоковой передачи mp3-файлов на веб-сервере (IIS).
На этот вопрос невозможно ответить, поскольку он зависит от множества различных факторов, которые будут варьироваться от страны к стране, от провайдера к провайдеру и от сервера к серверу. Единственный способ решить, что лучше для вас, - это запустить тесты производительности.


Dalerico

Спасибо за ответ, но я не совсем ясно сформулировал свой вопрос, как следовало бы. Пожалуйста, позвольте мне повторить мой вопрос. Не могли бы вы показать мне пример того, как я мог бы скрыть приведенный выше код для потоковой передачи для этого конкретного контракта IService?

Пример: буферный режим - список<loadalbumtracks&ГТ; LoadTracksByAlbum(строка AlbumID); против потока режим список<поток&ГТ; LoadTracksByAlbum(строка AlbumID);

Есть ли у вас какие-либо идеи, как я мог бы реализовать вышеупомянутый прокси-сервис (метод LoadTracksByAlbum), чтобы обернуть свойство TrackUrl для потоковой передачи mp3-файла. Свойство TrackUrl, которое находится в инструкции foreach, указывает путь к mp3 - файлу в базе данных SQL Server. И это свойство в основном получает путь к музыкальному mp3 индивидуально и извлекает фактический файл из папки, расположенной на веб-сервере приложения.

Richard MacCutchan

Извините, но у меня нет никаких примеров. Если они есть где-то поблизости, то Google должен быть в состоянии их найти.