C# 解析ffprobe查看视频信息返回的JSON数据 作者:马育民 • 2024-09-07 20:57 • 阅读:10012 ``` using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 截取视频 { internal class FFprobe { /// /// 视频宽度 /// public string width { get; private set; } /// /// 视频高度 /// public string height { get; private set; } /// /// 帧率 /// public string frameRate { get; private set; } /// /// 视频时长 /// public string duration { get; private set; } /// /// 比特率 /// public string bitRate { get; private set; } /// /// 旋转度数 /// public int rotation { get; private set; } /// /// 0表示横屏,1表示竖屏 /// public int landscapeOrPortrait { get; private set; } // 是否标准格式 private bool ok; public FFprobe(string content) { JObject json = JObject.Parse(content); JToken videoJson = null; JToken audioJson = null; // 获取视频信息、音频信息 JToken arr0 = null; if (json["streams"].ToArray().Length >= 1) { arr0 = json["streams"].ToArray()[0]; } else { ok = false; } JToken arr1 = null; if (json["streams"].ToArray().Length >= 2) { arr1 = json["streams"].ToArray()[1]; } else { ok = false; } // 获取格式信息 JToken formatJson = json["format"]; //Console.WriteLine("videoJson:" + videoJson); //Console.WriteLine("formatJson:" + formatJson); // 有的视频第一个部分是视频,有的第二个部分是视频 if (arr0["codec_type"].ToString() == "video") { videoJson = arr0; }else if (arr1["codec_type"].ToString() == "video") { videoJson = arr1; } parseWidthAndHeight(videoJson); parseFrameRate(videoJson); parseBitRate(videoJson,formatJson); parseDuration(formatJson); parseRotation(videoJson); parseLandscapeOrPortrait(videoJson); } // 是否标准格式 public void isOK() { } //解析视频宽度、高度 private void parseWidthAndHeight(JToken videoJson) { JToken widthJT = videoJson["width"]; if (widthJT != null) { width = widthJT.ToString(); } else { width= "未知"; } JToken heightJT = videoJson["height"]; if (heightJT != null) { height = heightJT.ToString(); } else { height = "未知"; } } // 解析视频帧率 private void parseFrameRate(JToken videoJson) { frameRate = videoJson["r_frame_rate"].ToString(); if (frameRate.Trim().Length > 0) { frameRate = frameRate.Substring(0, frameRate.IndexOf("/")); int frameRateInt = int.Parse(frameRate); if (frameRateInt > 1000) { frameRateInt = frameRateInt / 1000; } frameRate = frameRateInt + ""; } } // 解析比特率 private void parseBitRate(JToken videoJson,JToken formatJson) { JToken bitRateJT = videoJson["bit_rate"]; if (bitRateJT != null) { bitRate = bitRateJT.ToString(); } if (bitRate == null || bitRate.Trim().Length == 0) { bitRateJT = formatJson["bit_rate"]; if (bitRateJT != null) { bitRate = bitRateJT.ToString(); } } if (bitRate != null && bitRate != "") { bitRate = (int.Parse(bitRate) / 1000) + "kbps"; } else { bitRate = "未知"; } } // 解析时长 private void parseDuration(JToken formatJson) { duration = "未知"; JToken durationJT = formatJson["duration"]; if (durationJT != null) { string duration = durationJT.ToString(); double durationInt = double.Parse(duration); TimeSpan time = TimeSpan.FromSeconds(durationInt); this.duration = time.ToString(@"hh\:mm\:ss"); } } /// /// 获取分辨率宽高比例 /// 需要先执行 parseLandscapeOrPortrait() 方法 /// /// public string getRatio() { if(width!="未知" && height != "未知") { int widthInt = int.Parse(width); int heightInt = int.Parse(height); int gys = GCD(widthInt, heightInt); return (widthInt/gys ) + ":"+(heightInt/gys ); } return "未知"; } /// /// 返回旋转度数,常用于手机拍的视频,用于识别横屏、竖屏 /// /// public void parseRotation(JToken videoJson) { this.rotation = 0; JToken sideDataListJT = videoJson["side_data_list"]; if (sideDataListJT != null) { JToken sideDataListJTFist = sideDataListJT.ToArray()[0]; JToken rotationJT = sideDataListJTFist["rotation"]; if(rotationJT!=null) { this.rotation = int.Parse(rotationJT.ToString()); } } } /// /// 返回横屏或竖屏,0表示横屏,1表示竖屏 /// 需要先调用 parseRotation() 方法 /// /// public void parseLandscapeOrPortrait(JToken videoJson) { int rotation = Math.Abs(this.rotation);// 有时是负数 if(rotation == 90 || rotation == 270) // 是90或270度是表示竖屏 { this.landscapeOrPortrait = 1; } else { this.landscapeOrPortrait = 0; } } // 计算最大公约数,用于计算分辨率比例 public int GCD(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; } } } ``` 原文出处:http://malaoshi.top/show_1IX8NuYNHFAk.html