AudioEncoder.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using MediaBrowser.Common.Configuration;
  2. using MediaBrowser.Common.IO;
  3. using MediaBrowser.Controller.LiveTv;
  4. using MediaBrowser.Model.IO;
  5. using MediaBrowser.Model.Logging;
  6. using System.Collections.Generic;
  7. using System.Globalization;
  8. using System.Threading.Tasks;
  9. namespace MediaBrowser.MediaEncoding.Encoder
  10. {
  11. public class AudioEncoder
  12. {
  13. private readonly string _ffmpegPath;
  14. private readonly ILogger _logger;
  15. private readonly IFileSystem _fileSystem;
  16. private readonly IApplicationPaths _appPaths;
  17. private readonly IIsoManager _isoManager;
  18. private readonly ILiveTvManager _liveTvManager;
  19. private readonly CultureInfo _usCulture = new CultureInfo("en-US");
  20. public AudioEncoder(string ffmpegPath, ILogger logger, IFileSystem fileSystem, IApplicationPaths appPaths, IIsoManager isoManager, ILiveTvManager liveTvManager)
  21. {
  22. _ffmpegPath = ffmpegPath;
  23. _logger = logger;
  24. _fileSystem = fileSystem;
  25. _appPaths = appPaths;
  26. _isoManager = isoManager;
  27. _liveTvManager = liveTvManager;
  28. }
  29. public Task BeginEncoding(InternalEncodingTask task)
  30. {
  31. return new FFMpegProcess(_ffmpegPath, _logger, _fileSystem, _appPaths, _isoManager, _liveTvManager).Start(task, GetArguments);
  32. }
  33. private string GetArguments(InternalEncodingTask task, string mountedPath)
  34. {
  35. var options = task.Request;
  36. return string.Format("{0} -i {1} {2} -id3v2_version 3 -write_id3v1 1 \"{3}\"",
  37. GetInputModifier(task),
  38. GetInputArgument(task),
  39. GetOutputModifier(task),
  40. options.OutputPath).Trim();
  41. }
  42. private string GetInputModifier(InternalEncodingTask task)
  43. {
  44. return EncodingUtils.GetInputModifier(task);
  45. }
  46. private string GetInputArgument(InternalEncodingTask task)
  47. {
  48. return EncodingUtils.GetInputArgument(new List<string> { task.MediaPath }, task.IsInputRemote);
  49. }
  50. private string GetOutputModifier(InternalEncodingTask task)
  51. {
  52. var options = task.Request;
  53. var audioTranscodeParams = new List<string>
  54. {
  55. "-threads " + EncodingUtils.GetNumberOfThreads(task, false).ToString(_usCulture),
  56. "-vn"
  57. };
  58. var bitrate = EncodingUtils.GetAudioBitrateParam(task);
  59. if (bitrate.HasValue)
  60. {
  61. audioTranscodeParams.Add("-ab " + bitrate.Value.ToString(_usCulture));
  62. }
  63. var channels = EncodingUtils.GetNumAudioChannelsParam(options, task.AudioStream);
  64. if (channels.HasValue)
  65. {
  66. audioTranscodeParams.Add("-ac " + channels.Value);
  67. }
  68. if (options.AudioSampleRate.HasValue)
  69. {
  70. audioTranscodeParams.Add("-ar " + options.AudioSampleRate.Value);
  71. }
  72. return string.Join(" ", audioTranscodeParams.ToArray());
  73. }
  74. }
  75. }