StreamInfo.cs 4.9 KB

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