|
|
|
@ -176,6 +176,14 @@ namespace MediaBrowser.MediaEncoding.Probing
|
|
|
|
|
info.Video3DFormat = Video3DFormat.FullSideBySide;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var mediaStream in info.MediaStreams)
|
|
|
|
|
{
|
|
|
|
|
if (mediaStream.Type == MediaStreamType.Audio && !mediaStream.BitRate.HasValue)
|
|
|
|
|
{
|
|
|
|
|
mediaStream.BitRate = GetEstimatedAudioBitrate(mediaStream.Codec, mediaStream.Channels);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var videoStreamsBitrate = info.MediaStreams.Where(i => i.Type == MediaStreamType.Video).Select(i => i.BitRate ?? 0).Sum();
|
|
|
|
|
// If ffprobe reported the container bitrate as being the same as the video stream bitrate, then it's wrong
|
|
|
|
|
if (videoStreamsBitrate == (info.Bitrate ?? 0))
|
|
|
|
@ -187,6 +195,32 @@ namespace MediaBrowser.MediaEncoding.Probing
|
|
|
|
|
return info;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int? GetEstimatedAudioBitrate(string codec, int? channels)
|
|
|
|
|
{
|
|
|
|
|
if (!channels.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var channelsValue = channels.Value;
|
|
|
|
|
|
|
|
|
|
if (string.Equals(codec, "aac", StringComparison.OrdinalIgnoreCase) ||
|
|
|
|
|
string.Equals(codec, "mp3", StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
{
|
|
|
|
|
if (channelsValue <= 2)
|
|
|
|
|
{
|
|
|
|
|
return 192000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (channelsValue >= 5)
|
|
|
|
|
{
|
|
|
|
|
return 320000;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void FetchFromItunesInfo(string xml, MediaInfo info)
|
|
|
|
|
{
|
|
|
|
|
// Make things simpler and strip out the dtd
|
|
|
|
|