StreamInfo.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using MediaBrowser.Model.Dto;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Globalization;
  5. namespace MediaBrowser.Model.Dlna
  6. {
  7. /// <summary>
  8. /// Class StreamInfo.
  9. /// </summary>
  10. public class StreamInfo
  11. {
  12. public string ItemId { get; set; }
  13. public string MediaSourceId { get; set; }
  14. public bool IsDirectStream { get; set; }
  15. public DlnaProfileType MediaType { get; set; }
  16. public string Container { get; set; }
  17. public long StartPositionTicks { get; set; }
  18. public string VideoCodec { get; set; }
  19. public string AudioCodec { get; set; }
  20. public int? AudioStreamIndex { get; set; }
  21. public int? SubtitleStreamIndex { get; set; }
  22. public int? MaxAudioChannels { get; set; }
  23. public int? AudioBitrate { get; set; }
  24. public int? VideoBitrate { get; set; }
  25. public int? VideoLevel { get; set; }
  26. public int? MaxWidth { get; set; }
  27. public int? MaxHeight { get; set; }
  28. public int? MaxFramerate { get; set; }
  29. public string DeviceProfileId { get; set; }
  30. public string DeviceId { get; set; }
  31. public string ToUrl(string baseUrl)
  32. {
  33. return ToDlnaUrl(baseUrl);
  34. }
  35. public string ToDlnaUrl(string baseUrl)
  36. {
  37. if (string.IsNullOrEmpty(baseUrl))
  38. {
  39. throw new ArgumentNullException(baseUrl);
  40. }
  41. var dlnaCommand = BuildDlnaParam(this);
  42. var extension = string.IsNullOrEmpty(Container) ? string.Empty : "." + Container;
  43. baseUrl = baseUrl.TrimEnd('/');
  44. if (MediaType == DlnaProfileType.Audio)
  45. {
  46. return string.Format("{0}/audio/{1}/stream{2}?{3}", baseUrl, ItemId, extension, dlnaCommand);
  47. }
  48. return string.Format("{0}/videos/{1}/stream{2}?{3}", baseUrl, ItemId, extension, dlnaCommand);
  49. }
  50. private static string BuildDlnaParam(StreamInfo item)
  51. {
  52. var usCulture = new CultureInfo("en-US");
  53. var list = new List<string>
  54. {
  55. item.DeviceProfileId ?? string.Empty,
  56. item.DeviceId ?? string.Empty,
  57. item.MediaSourceId ?? string.Empty,
  58. (item.IsDirectStream).ToString().ToLower(),
  59. item.VideoCodec ?? string.Empty,
  60. item.AudioCodec ?? string.Empty,
  61. item.AudioStreamIndex.HasValue ? item.AudioStreamIndex.Value.ToString(usCulture) : string.Empty,
  62. item.SubtitleStreamIndex.HasValue ? item.SubtitleStreamIndex.Value.ToString(usCulture) : string.Empty,
  63. item.VideoBitrate.HasValue ? item.VideoBitrate.Value.ToString(usCulture) : string.Empty,
  64. item.AudioBitrate.HasValue ? item.AudioBitrate.Value.ToString(usCulture) : string.Empty,
  65. item.MaxAudioChannels.HasValue ? item.MaxAudioChannels.Value.ToString(usCulture) : string.Empty,
  66. item.MaxFramerate.HasValue ? item.MaxFramerate.Value.ToString(usCulture) : string.Empty,
  67. item.MaxWidth.HasValue ? item.MaxWidth.Value.ToString(usCulture) : string.Empty,
  68. item.MaxHeight.HasValue ? item.MaxHeight.Value.ToString(usCulture) : string.Empty,
  69. item.StartPositionTicks.ToString(usCulture),
  70. item.VideoLevel.HasValue ? item.VideoLevel.Value.ToString(usCulture) : string.Empty
  71. };
  72. return string.Format("Params={0}", string.Join(";", list.ToArray()));
  73. }
  74. }
  75. /// <summary>
  76. /// Class AudioOptions.
  77. /// </summary>
  78. public class AudioOptions
  79. {
  80. public string ItemId { get; set; }
  81. public List<MediaSourceInfo> MediaSources { get; set; }
  82. public DeviceProfile Profile { get; set; }
  83. /// <summary>
  84. /// Optional. Only needed if a specific AudioStreamIndex or SubtitleStreamIndex are requested.
  85. /// </summary>
  86. public string MediaSourceId { get; set; }
  87. public string DeviceId { get; set; }
  88. /// <summary>
  89. /// Allows an override of supported number of audio channels
  90. /// Example: DeviceProfile supports five channel, but user only has stereo speakers
  91. /// </summary>
  92. public int? MaxAudioChannels { get; set; }
  93. /// <summary>
  94. /// The application's configured quality setting
  95. /// </summary>
  96. public int? MaxBitrate { get; set; }
  97. }
  98. /// <summary>
  99. /// Class VideoOptions.
  100. /// </summary>
  101. public class VideoOptions : AudioOptions
  102. {
  103. public int? AudioStreamIndex { get; set; }
  104. public int? SubtitleStreamIndex { get; set; }
  105. public int? MaxAudioTranscodingBitrate { get; set; }
  106. public VideoOptions()
  107. {
  108. MaxAudioTranscodingBitrate = 128000;
  109. }
  110. }
  111. }