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

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

前言:因之前有遇到在项目中将.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;

            }

        }

    }

}

原文地址:https://www.cnblogs.com/luo-super/p/4722457.html