AudioHlsService.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using MediaBrowser.Common.MediaInfo;
  2. using MediaBrowser.Controller;
  3. using MediaBrowser.Controller.Dto;
  4. using MediaBrowser.Controller.Library;
  5. using MediaBrowser.Model.Dto;
  6. using MediaBrowser.Model.IO;
  7. using ServiceStack.ServiceHost;
  8. using System;
  9. namespace MediaBrowser.Api.Playback.Hls
  10. {
  11. /// <summary>
  12. /// Class GetHlsAudioStream
  13. /// </summary>
  14. [Route("/Audio/{Id}/stream.m3u8", "GET")]
  15. [Api(Description = "Gets an audio stream using HTTP live streaming.")]
  16. public class GetHlsAudioStream : StreamRequest
  17. {
  18. }
  19. /// <summary>
  20. /// Class AudioHlsService
  21. /// </summary>
  22. public class AudioHlsService : BaseHlsService
  23. {
  24. /// <summary>
  25. /// Initializes a new instance of the <see cref="AudioHlsService" /> class.
  26. /// </summary>
  27. /// <param name="appPaths">The app paths.</param>
  28. /// <param name="userManager">The user manager.</param>
  29. /// <param name="libraryManager">The library manager.</param>
  30. /// <param name="isoManager">The iso manager.</param>
  31. /// <param name="mediaEncoder">The media encoder.</param>
  32. public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService)
  33. : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService)
  34. {
  35. }
  36. /// <summary>
  37. /// Gets the specified request.
  38. /// </summary>
  39. /// <param name="request">The request.</param>
  40. /// <returns>System.Object.</returns>
  41. public object Get(GetHlsAudioStream request)
  42. {
  43. return ProcessRequest(request);
  44. }
  45. /// <summary>
  46. /// Gets the audio arguments.
  47. /// </summary>
  48. /// <param name="state">The state.</param>
  49. /// <returns>System.String.</returns>
  50. protected override string GetAudioArguments(StreamState state)
  51. {
  52. var codec = GetAudioCodec(state.Request);
  53. var args = "-codec:a " + codec;
  54. var channels = GetNumAudioChannelsParam(state.Request, state.AudioStream);
  55. if (channels.HasValue)
  56. {
  57. args += " -ac " + channels.Value;
  58. }
  59. if (state.Request.AudioSampleRate.HasValue)
  60. {
  61. args += " -ar " + state.Request.AudioSampleRate.Value;
  62. }
  63. if (state.Request.AudioBitRate.HasValue)
  64. {
  65. args += " -ab " + state.Request.AudioBitRate.Value;
  66. }
  67. return args;
  68. }
  69. /// <summary>
  70. /// Gets the video arguments.
  71. /// </summary>
  72. /// <param name="state">The state.</param>
  73. /// <param name="performSubtitleConversion">if set to <c>true</c> [perform subtitle conversion].</param>
  74. /// <returns>System.String.</returns>
  75. protected override string GetVideoArguments(StreamState state, bool performSubtitleConversion)
  76. {
  77. // No video
  78. return string.Empty;
  79. }
  80. /// <summary>
  81. /// Gets the segment file extension.
  82. /// </summary>
  83. /// <param name="state">The state.</param>
  84. /// <returns>System.String.</returns>
  85. /// <exception cref="System.ArgumentException">Must specify either aac or mp3 audio codec.</exception>
  86. /// <exception cref="System.InvalidOperationException">Only aac and mp3 audio codecs are supported.</exception>
  87. protected override string GetSegmentFileExtension(StreamState state)
  88. {
  89. if (state.Request.AudioCodec == AudioCodecs.Aac)
  90. {
  91. return ".aac";
  92. }
  93. if (state.Request.AudioCodec == AudioCodecs.Mp3)
  94. {
  95. return ".mp3";
  96. }
  97. throw new ArgumentException("Must specify either aac or mp3 audio codec.");
  98. }
  99. /// <summary>
  100. /// Gets the map args.
  101. /// </summary>
  102. /// <param name="state">The state.</param>
  103. /// <returns>System.String.</returns>
  104. protected override string GetMapArgs(StreamState state)
  105. {
  106. return string.Format("-map 0:{0}", state.AudioStream.Index);
  107. }
  108. }
  109. }