FFStreams 是反序列化媒体信息时使用的类结构
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FFmpegLib
{
/// <summary>
/// ff返回数据中的音频信息中的重要信息
/// </summary>
public interface IFFAudioStream
{
/// <summary>
/// 编码名称,一般为avg等
/// </summary>
string Codec { get; }
/// <summary>
/// 编码详细名称。含有编码详细信息
/// </summary>
string CodecLong { get; }
/// <summary>
/// 数据编码格式
/// </summary>
string Sample { get; }
/// <summary>
/// 采样率
/// </summary>
string Sample { get; }
/// <summary>
/// 通道个数
/// </summary>
int Channel { get; }
/// <summary>
/// 通道布局,比如立体声,5.1,7.1等
/// </summary>
string ChannelLayout { get; }
/// <summary>
/// 总时长的tick
/// </summary>
long Duration { get; }
/// <summary>
/// 总时长的字符串表示,单位秒,浮点数
/// </summary>
string Durations { get; }
/// <summary>
/// 码率,一般为采样率*通道数*采样位数
/// </summary>
string BitRate { get; }
/// <summary>
/// 采样位数,一般为8,12,16,24等
/// </summary>
int BitPerSample { get; }
}
/// <summary>
/// ff返回的视频信息中的重要信息
/// </summary>
public interface IFFVideoStream
{
/// <summary>
/// 编码名称,一般为h264等
/// </summary>
string Codec { get; }
/// <summary>
/// 编码详细名称。含有编码详细信息
/// </summary>
string CodecLong { get; }
/// <summary>
/// 视频的宽度
/// </summary>
int Width { get; }
/// <summary>
/// 视频的高度
/// </summary>
int Height { get; }
/// <summary>
/// 视频宽高比
/// </summary>
string DisplayAspect { get; }
/// <summary>
/// 总时长的tick
/// </summary>
long Duration { get; }
/// <summary>
/// 总时长的字符串表示,单位秒,浮点数
/// </summary>
string Durations { get; }
/// <summary>
/// 码率,一般为帧数据大小*帧率
/// </summary>
string BitRate { get; }
/// <summary>
/// 帧率
/// </summary>
string RFrameRate { get; }
}
/// <summary>
/// ffprobe输出的json格式的结构体内容中单个流内容
/// </summary>
public class FFStream : IFFAudioStream, IFFVideoStream
{
/// <summary>
/// 编号
/// </summary>
[Newtonsoft.Json.JsonProperty("index")]
public int Index { get; set; }
/// <summary>
/// 编码的名称
/// </summary>
[Newtonsoft.Json.JsonProperty("codec_name")]
public string Codec { get; set; }
/// <summary>
/// 编码的详细名称
/// </summary>
[Newtonsoft.Json.JsonProperty("codec_long_name")]
public string CodecLong { get; set; }
/// <summary>
/// 编码等级
/// </summary>
[Newtonsoft.Json.JsonProperty("profile")]
public string Profile { get; set; }
/// <summary>
/// 编码类型,audio,video等
/// </summary>
[Newtonsoft.Json.JsonProperty("codec")]
public string Codec { get; set; }
/// <summary>
/// 编码的时间基准?
/// </summary>
[Newtonsoft.Json.JsonProperty("codec_time_base")]
public string CodecTimeBase { get; set; }
/// <summary>
/// 编码相关字符串
/// </summary>
[Newtonsoft.Json.JsonProperty("codec_tag_string")]
public string CodecTagString { get; set; }
/// <summary>
/// 编码相关二进制值
/// </summary>
[Newtonsoft.Json.JsonProperty("codec")]
public string Codec { get; set; }
/// <summary>
/// 音频格式
/// </summary>
[Newtonsoft.Json.JsonProperty("sample_fmt")]
public string SampleFmt { get; set; }
/// <summary>
/// 音频采样率
/// </summary>
[Newtonsoft.Json.JsonProperty("sample_rate")]
public string SampleRate { get; set; }
/// <summary>
/// 音频通道数
/// </summary>
[Newtonsoft.Json.JsonProperty("channels")]
public int Channels { get; set; }
/// <summary>
/// 音频通道的布局?stereo=立体声
/// </summary>
[Newtonsoft.Json.JsonProperty("channel_layout")]
public string ChannelLayout { get; set; }
/// <summary>
/// 采样位数
/// </summary>
[Newtonsoft.Json.JsonProperty("bits_per_sample")]
public int BitsPerSample { get; set; }
/// <summary>
/// 视频宽度
/// </summary>
[Newtonsoft.Json.JsonProperty("width")]
public int Width { get; set; }
/// <summary>
/// 视频高度
/// </summary>
[Newtonsoft.Json.JsonProperty("height")]
public int Height { get; set; }
/// <summary>
/// 编码宽度
/// </summary>
[Newtonsoft.Json.JsonProperty("coded_width")]
public int CodedWidth { get; set; }
/// <summary>
/// 编码高度
/// </summary>
[Newtonsoft.Json.JsonProperty("coded_height")]
public int CodedHeight { get; set; }
/// <summary>
/// 枚举类型,是否含有b帧?
/// </summary>
[Newtonsoft.Json.JsonProperty("has_b_frames")]
public int HasBFrames { get; set; }
/// <summary>
/// 纵横比
/// </summary>
[Newtonsoft.Json.JsonProperty("sample_aspect")]
public string SampleAspect { get; set; }
/// <summary>
/// 宽高比
/// </summary>
[Newtonsoft.Json.JsonProperty("display_aspect_ratio")]
public string DisplayAspectRatio { get; set; }
/// <summary>
/// 像素格式
/// </summary>
[Newtonsoft.Json.JsonProperty("pix_fmt")]
public string PixFmt { get; set; }
/// <summary>
/// 压缩等级
/// </summary>
[Newtonsoft.Json.JsonProperty("level")]
public int Level { get; set; }
/// <summary>
/// 颜色范围
/// </summary>
[Newtonsoft.Json.JsonProperty("color_range")]
public string ColorRange { get; set; }
/// <summary>
/// 颜色空间
/// </summary>
[Newtonsoft.Json.JsonProperty("color_space")]
public string ColorSpace { get; set; }
/// <summary>
/// 透明色
/// </summary>
[Newtonsoft.Json.JsonProperty("color_transfer")]
public string ColorTransfer { get; set; }
/// <summary>
/// 主色调
/// </summary>
[Newtonsoft.Json.JsonProperty("color_primaries")]
public string ColorPrimaries { get; set; }
/// <summary>
/// 色饱和度
/// </summary>
[Newtonsoft.Json.JsonProperty("chroma_location")]
public string ChromaLocation { get; set; }
/// <summary>
/// 频次?
/// </summary>
[Newtonsoft.Json.JsonProperty("refs")]
public int Refs { get; set; }
/// <summary>
/// 是否是avc格式?
/// </summary>
[Newtonsoft.Json.JsonProperty("is_avc")]
public string IsAvc { get; set; }
/// <summary>
/// NALu长度
/// </summary>
[Newtonsoft.Json.JsonProperty("nal_length_size")]
public string NalLengthSize { get; set; }
/// <summary>
/// 帧率每秒
/// </summary>
[Newtonsoft.Json.JsonProperty("r_frame_rate")]
public string RFrameRate { get; set; }
/// <summary>
/// 帧率每?
/// </summary>
[Newtonsoft.Json.JsonProperty("avg_frame_rate")]
public string AvgFrameRate { get; set; }
/// <summary>
/// 时间基准?
/// </summary>
[Newtonsoft.Json.JsonProperty("time_base")]
public string TimeBase { get; set; }
/// <summary>
/// 起始?
/// </summary>
[Newtonsoft.Json.JsonProperty("start_pts")]
public long StartPts { get; set; }
/// <summary>
/// 开始时间?
/// </summary>
[Newtonsoft.Json.JsonProperty("start_time")]
public string StartTime { get; set; }
/// <summary>
/// 总时长的tick时间
/// </summary>
[Newtonsoft.Json.JsonProperty("duration_ts")]
public long DurationTs { get; set; }
/// <summary>
/// 总时长的秒数浮点时间
/// </summary>
[Newtonsoft.Json.JsonProperty("duration")]
public string Duration { get; set; }
/// <summary>
/// 码率
/// </summary>
[Newtonsoft.Json.JsonProperty("bit_rate")]
public string BitRate { get; set; }
/// <summary>
/// 最大码率
/// </summary>
[Newtonsoft.Json.JsonProperty("max_bit_rate")]
public string MaxBitRate { get; set; }
/// <summary>
/// 样本位数
/// </summary>
[Newtonsoft.Json.JsonProperty("bits_per_raw_sample")]
public string BitsPerRawSample { get; set; }
/// <summary>
/// 帧率?
/// </summary>
[Newtonsoft.Json.JsonProperty("nb_frames")]
public string NbFrames { get; set; }
/// <summary>
///
/// </summary>
[Newtonsoft.Json.JsonProperty("disposition")]
public FFDisposition Disposition { get; set; }
/// <summary>
///
/// </summary>
[Newtonsoft.Json.JsonProperty("tags")]
public FFTags Tags { get; set; }
/// <summary>
///
/// </summary>
[Newtonsoft.Json.JsonProperty("side_data_list")]
public FFSideData[] SideDataList { get; set; }
}
/// <summary>
/// 数据处理?
/// </summary>
public class FFDisposition
{
/// <summary>
/// 默认??
/// </summary>
[Newtonsoft.Json.JsonProperty("default")]
public int Default { get; set; }
/// <summary>
/// dub音效?
/// </summary>
[Newtonsoft.Json.JsonProperty("dub")]
public int Dub { get; set; }
/// <summary>
/// 原始值?
/// </summary>
[Newtonsoft.Json.JsonProperty("original")]
public int Original { get; set; }
/// <summary>
/// 评论?
/// </summary>
[Newtonsoft.Json.JsonProperty("comment")]
public int Comment { get; set; }
/// <summary>
/// 歌词?
/// </summary>
[Newtonsoft.Json.JsonProperty("lyrics")]
public int Lyrics { get; set; }
/// <summary>
/// 卡拉ok?
/// </summary>
[Newtonsoft.Json.JsonProperty("karaoke")]
public int Karaoke { get; set; }
/// <summary>
/// 强迫?
/// </summary>
[Newtonsoft.Json.JsonProperty("forced")]
public int Forced { get; set; }
/// <summary>
/// 破音?
/// </summary>
[Newtonsoft.Json.JsonProperty("hearing_impaired")]
public int HearingImpaired { get; set; }
/// <summary>
/// 幻视?
/// </summary>
[Newtonsoft.Json.JsonProperty("visual_impaired")]
public int VisualImpaired { get; set; }
/// <summary>
/// 过场特效?
/// </summary>
[Newtonsoft.Json.JsonProperty("clean_effects")]
public int CleanEffects { get; set; }
/// <summary>
/// 附件图片?
/// </summary>
[Newtonsoft.Json.JsonProperty("attached_pic")]
public int AttachedPic { get; set; }
/// <summary>
/// 缩略图?
/// </summary>
[Newtonsoft.Json.JsonProperty("timed_thumbnails")]
public int TimedThumbnails { get; set; }
}
/// <summary>
/// ff编码相关标签?
/// </summary>
public class FFTags
{
/// <summary>
/// 旋转角度?
/// </summary>
[Newtonsoft.Json.JsonProperty("rotate")]
public string Rotate { get; set; }
/// <summary>
/// 创建时间?
/// </summary>
[Newtonsoft.Json.JsonProperty("creation_time")]
public DateTime CreationTime { get; set; }
/// <summary>
/// 语言?
/// </summary>
[Newtonsoft.Json.JsonProperty("language")]
public string Language { get; set; }
/// <summary>
/// 创建时用的创建对象名称?
/// </summary>
[Newtonsoft.Json.JsonProperty("handler_name")]
public string HandlerName { get; set; }
}
/// <summary>
/// ff侧面数据?
/// </summary>
public class FFSideData
{
/// <summary>
/// 类型
/// </summary>
[Newtonsoft.Json.JsonProperty("side_data_type")]
public string SideDataType { get; set; }
/// <summary>
/// 显示矩阵信息
/// </summary>
[Newtonsoft.Json.JsonProperty("displaymatrix")]
public string DisplayMatrix { get; set; }
/// <summary>
/// 显示方向?
/// </summary>
[Newtonsoft.Json.JsonProperty("rotation")]
public int Rotation { get; set; }
}
/// <summary>
/// ffprobe输出的json格式的结构体
/// </summary>
public class FFStreams
{
/// <summary>
/// 多个流内容
/// </summary>
[Newtonsoft.Json.JsonProperty("streams")]
public FFStream[] Streams { get; set; }
/// <summary>
/// 获取可能存在的音频编码信息
/// </summary>
[Newtonsoft.Json.JsonIgnore]
public IFFAudioStream[] AudioStream => Streams.Where(x => x.CodecType == "audio").ToArray();
/// <summary>
/// 获取可能存在的视频流信息
/// </summary>
[Newtonsoft.Json.JsonIgnore]
public IFFVideoStream[] VideoStream => Streams.Where(x => x.CodecType == "video").ToArray();
/// <summary>
/// 将ff返回的数据反编译
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static FFStreams Parse(string data) => Newtonsoft.Json.JsonConvert.DeserializeObject<FFStreams>(data);
}
}