判断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 ...
随机推荐
- EMQX Cloud Serverless 正式上线:三秒部署、按量计费的 MQTT Serverless 云服务
近日,全球领先的开源物联网数据基础设施软件供应商 EMQ 正式发布了 MQTT Serverless 云服务 -- EMQX Cloud Serverless 的 Beta 版本,开创性地采用弹性多租 ...
- C# RGB转Brush
C#中自定义一个Brush,使用Color赋RGB值给Brush: dataGrid2.HorizontalGridLinesBrush = new SolidColorBrush(System.Wi ...
- 蓝桥杯训练赛二-问题 B
字符串的输入输出处理. 输入 第一行是一个正整数N,最大为100.之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000. 输出 先将输入中的前N行字符串(可能含有空格)原样 ...
- 【Ubuntu】设置桌面文件夹路径
Ubuntu 系统会将桌面文件夹路径默认设置为 $HOME/Desktop,包括文档.下载.图片等文件夹路径都有各自的默认路径.若想更改这些文件夹路径,可参考『此链接』. 首先到希望更改的路径下建立桌 ...
- SQL in查询字段为Guid拼接处理办法
场景一:在我们写SQL脚本执行普通的Id 为Int,Long 类型查询为 譬如: select *from Table where id in (1,2,3); 场景二:SQL in 查询,当查询字段 ...
- ubuntu iptables 做为路由转发
实现功能,本地服务器的号段的192.168.8.0/24,而做为路由器的机器有2个ip,192.168.8.x和另一个ip,而另一个ip可以访问 192.168.2.0/24号段, 为了让其它192. ...
- 7款WordPress图片分离对象存储插件 含国内主流云服务存储商
如果我们有用WordPress搭建网站的朋友应该会发现网站文件和数据库其实没有多大,在网站运营几年后数据最大的就是图片.而且图片占用服务器的空间会搬家比较麻烦,而且占用服务求的带宽.我们看到很多的Wo ...
- python--线性回归
首先先安装要用到的包:sklearn,顾名思义机器学习包 import matplotlib.pyplot as plt import numpy as np import pandas as pd ...
- 91、mysql批量删除表
## 存储过程实现 drop PROCEDURE if EXISTS rush; create PROCEDURE rush() BEGIN ## 创建临时表,插入快照数据 drop table if ...
- C++实现单链表相关操作
#include<iostream>#include<cstdlib>//C++动态分配存储空间using namespace std;#define OK 1#define ...