判断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 ...
随机推荐
- matlab读写文件操作
文件相对路径 在编码中尽可能使用相对路径: 1.当前路径下,直接:' xxx.bin ' 2.在下一级路径下,使用:' .\下一级路径文件名\xxx.bin ' 3.在上一级路径下,使用:' ..\x ...
- DAC双通道模板
#define DAC_C #include "dac.h" float DAC_DispenseA; float DAC_DispenseB; void MyDAC_Init(v ...
- 疾速瓜牛 Linux三剑客 之 sed学习与应用
sed, 是stream editor的缩写,顾名思义,就是个非交互式行编辑器,有以下特点: 它能执行与编辑器 vi 和 ex 相同的编辑任务 sed 编辑器没有提供交互式使用方式,使用者只能在命令行 ...
- Python学习:画K帮
import datetime import pandas_datareader.data as web df_stockload = web.DataReader("600797.SS&q ...
- Win10下VM虚拟机桥接模式无法上网的相关问题?
首先:在LR中点击虚拟机->设置,勾选桥接模式,勾选之后无法上网 1. 选中虚拟网卡VMnet8(NAT模式)和WLAN(本机)网卡,右键选择"桥接",然后系统创建一个 ...
- ubuntu - 程序运行的一些基础知识
1.指定编码格式 -finput-charset=GB2312 指定 C 程序的编码方式为 GB2312,不指定时默认编码方式为 UTF-8 -fexec-charset=GB2312 指定 可执行程 ...
- 图形学的up
https://space.bilibili.com/512313464 c++ 路线有前者的经历https://mp.weixin.qq.com/s?__biz=Mzg2MDU0ODM3MA==&a ...
- rust crm 镜像源管理
一.下载crm cargo install crm https://github.com/wtklbm/crm 二.命令 # 在终端执行 # # NOTE: # - [args] 表示 args 是一 ...
- map()函数应用
title: map()函数应用 author: 杨晓东 permalink: map()函数应用 date: 2021-10-02 11:27:04 categories: - 投篮 tags: - ...
- 【2】locust性能测试原理分析+登录测试脚本+总结
login_per_test1.py #对登录功能进行单点性能测试(一组测试数据)#发送首页请求,通过locust进行性能测试from locust import HttpLocust,task,T ...