判断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 ...
随机推荐
- 认识JavaWeb
JavaWeb Java Web 1.基本概念 1.1.前言 web开发: web,网页的意思 , www.baidu.com 静态web html,css 提供给所有人看的数据始终不会发生变化! 动 ...
- joda实现时间工具类
1.获取当前时间 (底层代码一致) val time1 = new DateTime() val time2 = DateTime.now() //底层调用的就是new DateTime() 2.格式 ...
- (转载)史上最详细的docker学习手册
原文链接:https://my.oschina.net/u/1388595/blog/5078146 一.docker入门 1.docker的安装及入门示例 环境准备:docker需要安装在cento ...
- Odoo12 + Windows+Visual Studio Code环境安装
参考 https://www.cnblogs.com/ecprodoo/p/13195748.html 1.要用odoo12需要安装以下几个软件 (1)Python 3.7, Python 3.8支持 ...
- PowerShell学习笔记四_函数、IO操作、字符操作、数组
使用静态方法 $now = [DateTime]::Now 实例化 $var=New-Object System.DateTime(1991,12,14)#实例化不需要[] 函数定义 Function ...
- @order(1)
@order(num),数字表示加载顺序 1.AOP加载顺序(切面加载顺序) 2.配置类加载顺序
- kotlin inline的缺点
inline关键字修饰的方法,可以在运行时将代码复制到使用处 用来控制打印好用 但有两个缺点: 一.修饰的方法不能太大,行数也不能太多,不然会造成很多重复代码 2.控制打印时,方法的行数最好与使用的行 ...
- 关于HTML5语义化
根据 HTML5 规范,在没有其他合适标签更合适时,才应该把 <b> 标签作为最后的选项. HTML5 规范声明:应该使用 <h1> - <h6> 来表示标题,使用 ...
- 定制个性化echarts 仪表盘
option = { series: [ { type : "gauge", center: ["50%", "45%"], // 默认全局 ...
- SpringBoot接口防刷
一.自定义注解 import java.lang.annotation.Retention; import java.lang.annotation.Target; import static jav ...