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. Scala集合总结

    Scala同时支持可变集合和不可变集合,包含两个包: 可变集合:scala.collection.mutable 不可变集合:scala.collection.immutable Scala默认采用不 ...

  2. Linux安装oracle jdk

    jdk8下载地址:Java Archive Downloads - Java SE 8 (oracle.com) ##安装oracle linux时自带的jdk [root@mylinux7 ~]# ...

  3. docker的安装和命令

    一. 认识Docker 我们写的代码会接触好几个环境:开发环境,测试环境以及生产环境 开发环境:程序员开发代码的环境 测试环境:开发完的代码部署到测试环境 给测试人员进行测试 生产环境:测试完成后有运 ...

  4. AI大模型学习了解

    # 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...

  5. 自考网络原理:安全套接字层SSL

    对ssl/tls的理解 前:SSL; 后:TLS: 以下是B站上的up主讲的,非常的深入浅出,讲的很好.感谢技术蛋老师. https://www.bilibili.com/video/BV1KY411 ...

  6. python 文件 写入

    import sys import os # 打印当前文件的路径 print(__file__) # 打印当前文件所在文件夹的路径 print(os.path.dirname(__file__)) # ...

  7. matplotlib 中文乱码的解决方法

    关于报错信息 Glyph 26426 missing from current font. 这个错误的原因是:本地没有可支持中文字体显示的配置文件,所以第一步需要先去下载相关的配置文件. 下载链接 h ...

  8. Cloud9 3.0 SDK安装

    Cloud9 IDE是一个基于Node.JS构建的JavaScript程序开发Web IDE.它拥有一个非常快的文本编辑器支持为JS, HTML, CSS和这几种的混合代码进行着色显示.Cloud9 ...

  9. HDLbits—— 3-input look-up-table

    // a 3-input look-up-table // In this question, you will design a circuit for an 8x1 memory, // wher ...

  10. 点击dgv某列的单元格时触发事件的方法

    private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.Colu ...