• 视频转码在实际项目中的应用


    视频转码在实际项目中的应用

    前言:因之前有遇到在项目中将.flv文件视频转换为.mp4,故作此记录,以下是使用ffmpeg.exe作为转码工具。

    1:接下来需要准备工具;http://ffmpeg.org/  下载相应版本的ffmpeg.exe(64+32)

    2:实现代码,以下只是其中一种实现方式:

    using System;

    using System.Collections.Generic;

    using System.Diagnostics;

    using System.Linq;

    using System.Web;

    namespace VideoConvert.Models

    {

        public class FFmpegHelper

        {

            /// <summary>

            /// 32位

            /// </summary>

            private static string ffmpegPath32 = AppDomain.CurrentDomain.BaseDirectory + @"ffmpeg32ffmpeg.exe";

            /// <summary>

            /// 64位

            /// </summary>

            private static string ffmpegPath64 = AppDomain.CurrentDomain.BaseDirectory + @"ffmpeg64ffmpeg.exe";

            /// <summary>

            /// 实际版本

            /// </summary>

            private static string path;

            private static Process p = null;

            /// <summary>

            /// 将flv转码为 mp4

            /// </summary>

            /// <param name="oldPath">....flv</param>

            /// <param name="newPath">.....mp4</param>

            public void VideoConvert(string oldPath,string newPath)

            {

                using (p = new Process())

                {

                    //更多转码方式可以查看官方文档,以下只是其中一种:

                    string arg = "  -i  " + oldPath + "  -c:v libx264 -crf 23 -c:a libfaac -q:a 100 " + newPath;

                    //判断系统版本:

                    Is32Or64();

                    p.StartInfo.Arguments = arg;

                    p.StartInfo.FileName = path;

                    p.StartInfo.RedirectStandardError = true;

                    p.StartInfo.RedirectStandardInput = true;

                    p.StartInfo.RedirectStandardOutput = true;

                    //表示不显示转码窗口

                    p.StartInfo.CreateNoWindow = true;

                    p.StartInfo.UseShellExecute = false;

                    //设置进程终止时触发事件;

                    p.EnableRaisingEvents = true;

                    p.Exited += new EventHandler(p_Exited);

                    p.OutputDataReceived +=new DataReceivedEventHandler(p_OutputDataReceived);

                    p.ErrorDataReceived +=new DataReceivedEventHandler(p_ErrorDataReceived);

                    p.Start();

                    //读取输出;

                    p.BeginOutputReadLine();

                    p.BeginErrorReadLine();

                    //设置等待进程触发p_Exited事件后在往下执行;

                    p.WaitForExit();

                }

            }

            void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)

            {

                //记录输出日志

            }

            void p_OutputDataReceived(object sender, DataReceivedEventArgs e)

            {

                //记录输出日志

            }

            void p_Exited(object sender, EventArgs e)

            {

                //进程退出触发该事件,可以利用此执行其它操作或者是判断

            }

            public void Is32Or64()

            {

                if (Environment.Is64BitOperatingSystem)

                {

                    path = ffmpegPath64;

                }

                else {

                    path = ffmpegPath32;

                }

            }

        }

    }

  • 相关阅读:
    编写测试类实现并发访问固定URL(亲测能用!!!)
    java项目添加log4j打印日志+转换系统时间
    springboot项目没错,但就是报红叉
    我想查看数据库名,输入命令:select name from v$database;为什么会说表和视图不存在
    DRUID连接池的实用 配置详解+使用方法+监控方式(太强大了!!!)
    Druid连接池 属性说明
    springBoot2.2.0+mybatis-xml文件方式+Oracle11g+jsp页面,实现简单的CRUD
    s5-12 RIP
    s5-12 RIP
    s5-13 RIP 为什么会 衰败
  • 原文地址:https://www.cnblogs.com/luo-super/p/4722457.html
Copyright © 2020-2023  润新知