public override string ToString() { StringBuilder sb = new StringBuilder(); sb.AppendLine("Codec name: " + CodecName); sb.Append("Codec type: " + CodecType); if (Bitrate != 0) { sb.Append("\nBit rate: " + BasicMediaFormatInfo.GetBitrateFormat(Bitrate)); } if (!Double.IsNaN(FrameRate)) { sb.Append("\nFrame rate: " + FrameRate.ToString("0.00") + " FPS"); } if (Duration != 0) { sb.Append("\nDuration: " + BasicMediaFormatInfo.GetTimeFormat((int)Duration)); } if (Title != "") { sb.Append("\nTitle: \"" + Title + "\""); } if (Language != "") { sb.Append("\nLanguage: \"" + Language + "\""); } return(sb.ToString()); }
public static EncoderResult Encoder(string inputFile, string outputPath) { BasicMediaFormatInfo info = new BasicMediaFormatInfo(inputFile); int videoIndex = -1; int audioIndex = -1; for (int i = 0; i < info.MediaInfo.Length; i++) { if (info.MediaInfo[i].CodecType == "video") { videoIndex = i; break; } } for (int i = 0; i < info.MediaInfo.Length; i++) { if (info.MediaInfo[i].CodecType == "audio") { audioIndex = i; break; } } return(Encoder(inputFile, outputPath, info, videoIndex, audioIndex)); }
private static EncoderResult Encoder(string inputFile, string outputPath, BasicMediaFormatInfo info, int videoIndex, int audioIndex) { EncoderResult encoderResult = new EncoderResult(); encoderResult.VideoInfo = null; encoderResult.AudioInfo = null; if (videoIndex != -1 && info.MediaInfo[videoIndex].CodecType == "video" && info.MediaInfo[videoIndex].CodecName != "mjpeg" && info.MediaInfo[videoIndex].CodecName != "png") { encoderResult.VideoInfo = new BasicVideoInfo((BasicVideoInfo)info.MediaInfo[videoIndex]); } if (audioIndex != -1 && info.MediaInfo[audioIndex].CodecType == "audio") { encoderResult.AudioInfo = new BasicAudioInfo((BasicAudioInfo)info.MediaInfo[audioIndex]); } encoderResult.Extension = null; if (encoderResult.VideoInfo != null) { encoderResult.Extension = ".mp4"; } else if (encoderResult.AudioInfo != null) { if (encoderResult.AudioInfo.CodecName == "vorbis" && encoderResult.AudioInfo.Channels <= 2) { encoderResult.Extension = ".ogg"; } else { encoderResult.Extension = ".m4a"; } } else { throw new Exception("\"" + inputFile + "\" does not have multimedia content."); } StringBuilder config = new StringBuilder(); if (encoderResult.VideoInfo != null) { if (encoderResult.VideoInfo.Width * encoderResult.VideoInfo.Height > 1920 * 1080) { double scale = 1920.0 / encoderResult.VideoInfo.Width; double heightScale = 1080.0 / encoderResult.VideoInfo.Height; if (scale > heightScale) { scale = heightScale; } encoderResult.VideoInfo.Width = (int)(encoderResult.VideoInfo.Width * scale); encoderResult.VideoInfo.Height = (int)(encoderResult.VideoInfo.Height * scale); } if (encoderResult.VideoInfo.Width * encoderResult.VideoInfo.Height > 1280 * 720 && encoderResult.VideoInfo.FrameRate > 30.0) { encoderResult.VideoInfo.FrameRate = 30.0; } if (encoderResult.VideoInfo.FrameRate > 60.0) { encoderResult.VideoInfo.FrameRate = 60.0; } if (encoderResult.VideoInfo.CodecName == "h264" && encoderResult.VideoInfo.Width == ((BasicVideoInfo)info.MediaInfo[videoIndex]).Width && encoderResult.VideoInfo.Height == ((BasicVideoInfo)info.MediaInfo[videoIndex]).Height && encoderResult.VideoInfo.FrameRate == ((BasicVideoInfo)info.MediaInfo[videoIndex]).FrameRate && encoderResult.VideoInfo.Level <= 4.2) { config.Append("-map 0:"); config.Append(videoIndex); config.Append(" -c:v copy"); } else { config.Append("-map 0:"); config.Append(videoIndex); config.Append(" -c:v libx264 -preset fast -crf 25 -s "); config.Append(encoderResult.VideoInfo.Width); config.Append("x"); config.Append(encoderResult.VideoInfo.Height); config.Append(" -r "); config.Append(encoderResult.VideoInfo.FrameRate); } } if (encoderResult.AudioInfo != null) { if (encoderResult.VideoInfo != null) { config.Append(" "); } if ((encoderResult.AudioInfo.CodecName == "aac" || encoderResult.AudioInfo.CodecName == "vorbis") && encoderResult.AudioInfo.Channels <= 2) { config.Append("-map 0:"); config.Append(audioIndex); config.Append(" -c:a copy"); } else { config.Append("-map 0:"); config.Append(audioIndex); config.Append(" -c:a aac -ac 2"); } } if (info.Size > 4294967296) { int bitrate = 0; double totalDuration = 0; if (encoderResult.VideoInfo != null && encoderResult.AudioInfo == null) { bitrate = encoderResult.VideoInfo.Bitrate; totalDuration = encoderResult.VideoInfo.Duration; } else if (encoderResult.VideoInfo == null && encoderResult.AudioInfo != null) { bitrate = encoderResult.AudioInfo.Bitrate; totalDuration = encoderResult.AudioInfo.Duration; } else if (encoderResult.VideoInfo == null && encoderResult.AudioInfo == null) { bitrate = encoderResult.VideoInfo.Bitrate + encoderResult.AudioInfo.Bitrate; totalDuration = encoderResult.VideoInfo.Duration; } if (bitrate == 0) { bitrate = info.Bitrate; } if (totalDuration == 0) { totalDuration = info.Duration; } double duration = 33822867456.0 / bitrate; double start = 0.0; int parts = (int)(totalDuration / duration); if (totalDuration % duration != 0.0) { parts++; } encoderResult.Name = new string[parts]; for (int i = 0; i < parts; i++) { encoderResult.Name[i] = Path.GetFileNameWithoutExtension(inputFile) + " part " + (i + 1).ToString(); string output = Path.Combine(outputPath, MediaInjector.ValidFilename(encoderResult.Name[i]) + encoderResult.Extension); string cut = "-ss " + start.ToString() + " -noaccurate_seek -t " + duration.ToString(); string arguments = cut + " -i \"" + inputFile + "\" " + config.ToString() + " \"" + output + "\""; FFmpeg(arguments); start += duration; } } else { encoderResult.Name = new string[1]; encoderResult.Name[0] = Path.GetFileNameWithoutExtension(inputFile); string output = Path.Combine(outputPath, MediaInjector.ValidFilename(encoderResult.Name[0]) + encoderResult.Extension); string arguments = "-i \"" + inputFile + "\" " + config.ToString() + " \"" + output + "\""; FFmpeg(arguments); } return(encoderResult); }