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 文件的更多相关文章

  1. ffmpeg代码笔记2:如何判断MP4文件里面的流是音频还是视频流

    http://blog.csdn.net/qq_19079937/article/details/43191211 在MP4结构体系里面,hdlr字段(具体在root->moov->tra ...

  2. EasyRTMP实现Demux解析MP4文件进行rtmp推送实现RTMP直播功能

    本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52965101 前面已经介绍过EasyRTMP,这里不 ...

  3. 使用python脚本批量删除阿里云oss中的mp4文件

    #encoding:utf-8 ''' oss中有一些mp4文件需要删除,首先定位出这些文件放在txt文本中 然后通过python操作oss进行批量删除 ''' import oss2 auth = ...

  4. JavaCV的摄像头实战之六:保存为mp4文件(有声音)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. video.js播放mp4文件

    HTML5的标签 video 支持的mp4编码为视频编码 H.264 音频AAC 参考网址 http://www.w3school.com.cn/html5/html_5_video.asp 视频格式 ...

  6. PHP判断远程文件是否存在

    <?php /* 函数:remote_file_exists 功能:判断远程文件是否存在 参数: $url_file -远程文件URL 返回:存在返回true,不存在或者其他原因返回false ...

  7. FFMpeg写MP4文件例子分析

    http://blog.csdn.net/eightdegree/article/details/7425811 这段时间看了FFMpeg提供的例子muxing.c,我略微修改了下源代码,使其生成一个 ...

  8. PHP多重判断删除文件函数

    <?function delete_file($file) {     if (file_exists($file))     {         $delete = chmod ($file, ...

  9. php如何判断远程文件是否存在

    <?php /*   函数:remote_file_exists   功能:判断远程文件是否存在   参数: $url_file -远程文件URL   返回:存在返回true,不存在或者其他原因 ...

  10. 嵌入式 使用mp4v2将H264+AAC合成mp4文件

    录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...

随机推荐

  1. top usage

    https://www.cnblogs.com/dragonsuc/p/5512797.html

  2. NOI 1.7编程基础之字符串

    11:潜伏者 1.描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则: 1.    S国军方内部欲发送的原信 ...

  3. notepad++设置

    1.背景颜色 [设置]-[语言格式设置] 选择主题:Solarized-light

  4. abap sql中进行除法操作

    在abap 得sql中进行除法操作要用division,不能用 " / "这个符号 SELECT vbeln, 100 * CAST( 10 + DIVISION( ZMENG, ...

  5. 重试机制的实现(Guava Retry)

    重试机制的实现 重试作用: 对于重试是有场景限制的,参数校验不合法.写操作等(要考虑写是否幂等)都不适合重试. 远程调用超时.网络突然中断可以重试.外部 RPC 调用,或者数据入库等操作,如果一次操作 ...

  6. 自定义jar包供ERP使用

    功能要求:需要在ERP中调用其他web服务或者自身web服务(比如跨账套过账等) 1.编写java程序,并将程序打包成jar包 import org.apache.http.HttpEntity; i ...

  7. SqlServer outer apply(cross apply)

    select * from baiduacg_cookies c cross apply (select top 1 * from product where AccountId=c.AccountI ...

  8. 2022.11.09 NOIP2022 模拟赛六

    科学 Source:CF461C Appleman and a Sheet of Paper,*2200. 注意到对于 \(p\le \lfloor \frac {now}{2}\rfloor\),直 ...

  9. unittest框架数据驱动

    一.目录 数据驱动概述 环境准备 使用unittest和ddt驱动 使用数据文件驱动 使用Excel驱动 使用XML驱动 使用MySQL驱动 二.数据驱动概述 数据驱动的定义: 相同的测试脚本使用不同 ...

  10. ABAP 报表的两种下钻功能

    在报表开发中往往会由需求要求跳转,SAP中提供了一些下钻的方式. 这里主要介绍两种 submit 和 call transaction submit 引用的是报表名称,以自开发报表居多 call tr ...