C# 解析ffprobe查看视频信息返回的JSON数据

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
    {
        /// <summary>
        /// 视频宽度
        /// </summary>
        public string width { 
            get; 
            private set;
        }
        /// <summary>
        /// 视频高度
        /// </summary>
        public string height { get; private set; }
        /// <summary>
        /// 帧率
        /// </summary>
        public string frameRate { get; private set; }
        /// <summary>
        /// 视频时长
        /// </summary>
        public string duration { get; private set; }
        /// <summary>
        /// 比特率
        /// </summary>
        public string bitRate { get; private set;  }
        /// <summary>
        /// 旋转度数
        /// </summary>
        public int rotation { get; private set; }
        /// <summary>
        /// 0表示横屏,1表示竖屏
        /// </summary>
        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");
            }
        }
        /// <summary>
        /// 获取分辨率宽高比例
        /// 需要先执行 parseLandscapeOrPortrait() 方法
        /// </summary>
        /// <returns></returns>
        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 "未知";

        }
        /// <summary>
        /// 返回旋转度数,常用于手机拍的视频,用于识别横屏、竖屏
        /// </summary>
        /// <param name="videoJson"></param>
        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());
                }
            }
        }
        /// <summary>
        /// 返回横屏或竖屏,0表示横屏,1表示竖屏
        /// 需要先调用 parseRotation() 方法
        /// </summary>
        /// <param name="videoJson"></param>
        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;
        }
    }
}

原文出处:/show_1IX8NuYNHFAk.html