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