判断MP4 文件
public class CheckResult
{
public bool IsMp4 { get; set; }
public bool SupportStreaming { get; set; }
}
/// <summary>
/// 判断是否Mp4及Moov前置
/// </summary>
/// <param name="mediaFile"></param>
/// <returns></returns>
public static CheckResult CheckMp4AndMoov(string mediaFile)
{
#region
//how to: c# 判断moov是否在mdat之前??
/*
mp4文件需要有ftyp, moov, mdat, 它们都是顶级Atom,不能被其他Atom嵌套。
ftyp 标示了MP4文件, 必须出现在第一个.
moov 保存了视频的基本信息.
mdat 保存视频和音频数据,这两个Atom顺序不固定。
*/
bool isMp4 = false;
bool isStreaming = false;
using (Stream fs = new FileStream(mediaFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
byte[] bytes = new byte[500];
fs.Position = 0;
int readLen = fs.Read(bytes, 0, bytes.Length);
/*char[] cc = Encoding.Default.GetChars(bytes);
StringBuilder sb = new StringBuilder();
foreach (char c in cc)
{
string s1 = c.ToString();
if (s1 == "\0")
{
continue;
}
sb.Append(s1);
}
res = sb.ToString();*/
//以下转换后再判断不准确!!! 应该直接查询原始bytes数组中的数据
//isMp4 = res.IndexOf("ftyp") >= 0;
//moovPos = res.IndexOf("moov");
//mdatPos = res.IndexOf("mdat");
//ASCII
//https://baike.baidu.com/item/ASCII/309296?fr=kg_general
//check if 'moov' at the begining, if yes, then ignore convert
int moovPos = GetIndexOf(bytes, new byte[] { 0x6d, 0x6f, 0x6f, 0x76, 0x0, 0x0, 0x0 });
//check "mdat"
int mdatPos = GetIndexOf(bytes, new byte[] { 0x6D, 0x64, 0x61, 0x74 });
//check "ftyp" for whether is mp4 file
int ftypPos = GetIndexOf(bytes, new byte[] { 0x66, 0x74, 0x79, 0x70 });
isMp4 = ftypPos >= 0;
if (isMp4)
{
if (moovPos > 0 && mdatPos < 0)
{
isStreaming = true;
}
else if (moovPos > 0 && mdatPos > 0 && moovPos < mdatPos)
{
isStreaming = true;
}
}
}
return new CheckResult
{
IsMp4 = isMp4,
SupportStreaming = isStreaming
};
#endregion
}
/// <summary>
/// 检测查询的字符是否连续存在
/// </summary>
/// <param name="bAll"></param>
/// <param name="bCheck"></param>
/// <param name="from"></param>
/// <returns></returns>
private static int GetIndexOf(byte[] bAll, byte[] bCheck, int from = 0)
{
#region
if (bAll == null || bCheck == null || bAll.Length == 0 || bCheck.Length == 0)
{
return -1;
}
int i, j;
for (i = from; i < bAll.Length; i++)
{
if (bAll[i] == bCheck[0])
{
for (j = 1; j < bCheck.Length; j++)
{
if (i + j >= bAll.Length)
{
break;
}
if (bAll[i + j] != bCheck[j])
{
break;
}
}
if (j == bCheck.Length)
{
return i;
}
}
}
return -1;
#endregion
}
/// <summary>
/// h264 format check
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static bool IsH264Mp4(string file)
{
#region
bool isH264 = false;
try
{
/*var ffP = new NReco.VideoInfo.FFProbe();
var vInfo = ffP.GetMediaInfo(file);
var s = vInfo.Streams;
foreach (var item in s)
{
if (item.CodecType == "video" && item.CodecName == "h264")
{
isH264 = true;
break;
}
}*/
var mediaFile = new MediaFile(file);
foreach (var vid in mediaFile.Video)
{
string type = vid.InternetMediaType + "";
isH264 = type.ToLower().IndexOf("h264") >= 0;
if (isH264)
{
break;
}
}
}
catch { }
return isH264;
#endregion
}
public static void KillProcess(string processName)
{
if (string.IsNullOrEmpty(processName))
{
return;
}
processName = Path.GetFileNameWithoutExtension(processName).ToLower();
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName.ToLower() != processName)
{
continue;
}
try
{
string cmdLine = p.GetCommandLineArgs();
if (cmdLine.IndexOf("MP4ConversionTool") > 0)
{
p.Kill();
p.WaitForExit();
}
}
catch (Exception ex)
{
Console.WriteLine(string.Format("Error:{0}\n{1}", ex.Message, ex.StackTrace));
}
}
}
判断MP4 文件的更多相关文章
- ffmpeg代码笔记2:如何判断MP4文件里面的流是音频还是视频流
http://blog.csdn.net/qq_19079937/article/details/43191211 在MP4结构体系里面,hdlr字段(具体在root->moov->tra ...
- EasyRTMP实现Demux解析MP4文件进行rtmp推送实现RTMP直播功能
本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52965101 前面已经介绍过EasyRTMP,这里不 ...
- 使用python脚本批量删除阿里云oss中的mp4文件
#encoding:utf-8 ''' oss中有一些mp4文件需要删除,首先定位出这些文件放在txt文本中 然后通过python操作oss进行批量删除 ''' import oss2 auth = ...
- JavaCV的摄像头实战之六:保存为mp4文件(有声音)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- video.js播放mp4文件
HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...
- PHP判断远程文件是否存在
<?php /* 函数:remote_file_exists 功能:判断远程文件是否存在 参数: $url_file -远程文件URL 返回:存在返回true,不存在或者其他原因返回false ...
- FFMpeg写MP4文件例子分析
http://blog.csdn.net/eightdegree/article/details/7425811 这段时间看了FFMpeg提供的例子muxing.c,我略微修改了下源代码,使其生成一个 ...
- PHP多重判断删除文件函数
<?function delete_file($file) { if (file_exists($file)) { $delete = chmod ($file, ...
- php如何判断远程文件是否存在
<?php /* 函数:remote_file_exists 功能:判断远程文件是否存在 参数: $url_file -远程文件URL 返回:存在返回true,不存在或者其他原因 ...
- 嵌入式 使用mp4v2将H264+AAC合成mp4文件
录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...
随机推荐
- OSPF配置知识总结3(多区域配置)
OSPF配置知识总结3(多区域配置) 1.相关解释: 要解决网络规模大了以后的问题:网络的扩展性,降低路由器负载,实现路由的更快收敛 OSPF多区域的区域类型分为Area 0(骨干区域), 以及非Ar ...
- sqoop mysql2hive
a./etc/profile添加export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*b.将hive-site.xml 拷贝到 $SQOO ...
- 【情景题】NPDP经典题目(上)
[情景题]NPDP经典题目(上) 1.一家玩具生产企业正在为10-12岁的儿童开发一种"动力车".潜在风险:尽管该公司在玩具市场有着丰富的经验,但是这些经验主要是针对5岁以下儿童玩 ...
- 【Ubuntu】Ubuntu 技巧集锦
『Ubuntu 22.04 国内镜像 阿里云/163源/清华大学/中科大』 『各种 Proxy 设置 GUI/Terminal/APT』 『设置 wget Proxy』 『设置右键菜单-新建文档』 『 ...
- 连接Oracle 19c出现ORA-28040:没有匹配的验证协议
错误信息:ORA-28040:没有匹配的验证协议处理方法 出现这个原因是因为你的Oracle连接客户端与服务端Oracle的版本不匹配造成的.一般是低版本客户端连接高版本服务端出现. 高版本连接低版本 ...
- VS2017创建Linux项目实现远程GDB调试
vs2017新增linux for C++的模块,尝试安装了一下环境. 首先,安装VS2017,安装时注意选择以下模块: 安装完成后,需要配置Linux服务端的部分,我的配置过程如下: 第一步,安装V ...
- Python学习笔记文件读写之遍历目录树
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- No.1.7
网页制作流程 创建根目录(网站的第一级文件夹) 1.图片文件夹:images 2.样式文件夹:CSS 3.首页:index.html <!-- 网站的首页 所有网站的首页都叫index.html ...
- Chtholly Tree 学习笔记
前言 珂朵莉树 (Chtholly Tree) 是一种简单优美的数据结构,就像 Chtholly 一样可爱.暴力即优美. 适用于一些有区间赋值操作的序列操作题. Chtholly Tree 的本质是把 ...
- Mysql数据库基础第二章:(九)分页查询
Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...