视频格式转化为FLV (C#)

来源:互联网 发布:python与数据挖掘 编辑:程序博客网 时间:2024/04/28 21:28
在上次随笔 Asp.net FMS 开发视频网站 中,好多朋友提到其他视频格式转化成FLV格式的问题,经过网上搜索资料研习整理,现经我的一点思路分享给大家:
        我添加了一个转换FLV工程 VideoConvert:

         1。配置文件里添加
         

 1 <appSettings>
 2
 3    <!--convert tools path-->
 4    <add key="FfmpegPath" value="D:/tools/"/>    
 5
 6    <!-- setting -->
 7    <add key="ThreadCount" value="5" />
 8    <add key="BatchSize" value="10" />
 9    <add key="QueueTimeout" value="20" />
10    <add key="TransactionTimeout" value="30" />
11  </appSettings>

        2。添加一个接口 

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace VideoConvert
 6{
 7    public interface IConvert
 8    {
 9
10        /// <summary>
11        /// 将视频文件转换为Flv格式
12        /// </summary>
13        /// <param name="sourceFile">要转换的文件</param>
14        /// <returns></returns>

15        bool Convert(string sourceFile);
16
17
18
19        /// <summary>
20        /// 获取缩略图
21        /// </summary>
22        /// <param name="sourceFile"></param>
23        /// <returns></returns>

24        bool GetSmallImage(string sourceFile);
25       
26
27    }

28}

29

3。转换工具设定继承 IConvert


 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Configuration;
 5
 6
 7namespace VideoConvert
 8{
 9    public class FfmpegConvert : IConvert
10    {
11
12
13        /// <summary>
14        /// 转换软件所在的路径
15        /// </summary>

16        private string ConvertTool = ConfigurationManager.AppSettings["FfmpegPath"+ "ffmpeg.exe";
17
18
19        /// <summary>
20        /// 构造函数
21        /// </summary>

22        public FfmpegConvert()
23        {
24
25        }

26
27
28        /// <summary>
29        /// 将视频文件转换为Flv格式
30        /// </summary>
31        /// <param name="sourceFile">要转换的文件</param>
32        /// <returns></returns>

33        public bool Convert(string sourceFile)
34        {
35            try
36            {
37                //文件名是否为空
38                if (string.IsNullOrEmpty(sourceFile)) return false;
39                //检测文件是否存在
40
41
42                string TargetFile = sourceFile.Substring(0, sourceFile.Length - 4+ ".flv";
43                string Argu = @"-i " + sourceFile + " -ab 56 -ar 22050 -b 500 -r 15 -s 480x360 " + TargetFile;
44
45                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ConvertTool, Argu);
46                System.Diagnostics.Process.Start(startInfo);
47                System.Threading.Thread.Sleep(6000);
48                return true;
49
50            }

51            catch (Exception exp)
52            {
53                throw exp;
54            }

55
56        }

57
58
59        /// <summary>
60        /// 获取缩略图
61        /// </summary>
62        /// <param name="sourceFile"></param>
63        /// <returns></returns>

64        public bool GetSmallImage(string sourceFile)
65        {
66
67            //文件名是否为空
68            if (string.IsNullOrEmpty(sourceFile)) return false;
69            //检测文件是否存在
70
71            try
72            {
73                string TargetFile = sourceFile.Substring(0, sourceFile.Length - 4+ ".jpg";
74                string Argu = @"-i " + sourceFile + " -y -f image2 -ss 08.010 -t 0.001 -s 352x240 " + TargetFile;
75                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ConvertTool, Argu);
76                System.Diagnostics.Process.Start(startInfo);
77                System.Threading.Thread.Sleep(6000);
78
79
80                //必须等待进行完成后才能返回结果
81
82
83                return true;
84
85            }

86            catch (Exception exp)
87            {
88                throw exp;
89            }

90
91        }

92
93    }

94}

95

   
4.


  1using System;
  2using System.Collections.Generic;
  3using System.Configuration;
  4using System.Text;
  5using System.Threading;
  6using System.Transactions;
  7using VideoConvert;
  8
  9namespace VideoConvert
 10{
 11    class Program
 12    {
 13
 14        //threadCount 
 15        private static int threadCount = int.Parse(ConfigurationManager.AppSettings["ThreadCount"]);
 16           
 17        private static IConvert tool = new FfmpegConvert();
 18
 19        //finished count
 20        private static int completeCount = 0;
 21
 22        static void Main(string[] args)
 23        {           
 24
 25
 26            Thread workTicketThread;
 27            Thread[] workerThreads = new Thread[threadCount];
 28
 29            for (int i = 0; i < threadCount; i++)
 30            {
 31
 32                workTicketThread = new Thread(new ThreadStart(ProcessVideo));
 33
 34                // Make this a background thread, so it will terminate when the main thread/process is de-activated
 35                workTicketThread.IsBackground = true;
 36                workTicketThread.SetApartmentState(ApartmentState.STA);
 37
 38                // Start the Work
 39                workTicketThread.Start();
 40                workerThreads[i] = workTicketThread;
 41            }

 42
 43            Console.WriteLine("Converting begin. press Enter stop");
 44            Console.ReadLine();
 45            Console.WriteLine("cancel");
 46
 47            //abort all threads
 48            for (int i = 0; i < workerThreads.Length; i++)
 49            {
 50
 51                workerThreads[i].Abort();
 52            }

 53
 54            Console.WriteLine();
 55            Console.WriteLine(" Processed" + completeCount + "video files");
 56            Console.WriteLine(" Process compeleted. press Enter to exit");
 57            Console.ReadLine();
 58
 59
 60        }

 61
 62
 63        /// <summary>
 64        /// Convert 
 65        /// </summary>
 66        /// <returns></returns>

 67        private static void ProcessVideo()
 68        
 69            
 70
 71            while (true)
 72            {
 73                
 74                
 75                                
 76                    if (!string.IsNullOrEmpty(waitConvertFile))
 77                    {
 78                        //Convert
 79                        Console.WriteLine("start to convert file:" + waitConvertFile + "");
 80                        try
 81                        {
 82                            if (tool.Convert(waitConvertFile.PhysicalPath) && tool.GetSmallImage(waitConvertFile.PhysicalPath))
 83                            {
 84                                completeCount++;
 85
 86                                //Change waitConvertFile status if need
 87                              
 88                            }

 89                        }

 90                        catch (Exception exp)
 91                        {
 92                            //setting Convert failure
 93                            Console.WriteLine("文件" + waitConvertFile.VideoID + "Convert failure");
 94                        }

 95                        Console.WriteLine("文件" + waitConvertFile.VideoID + "Convert ending");
 96                        Thread.Sleep(1000);
 97                    }

 98                    Thread.Sleep(1000 * 60);
 99
100                             
101                
102                                 
103              
104            }
         
105
106           
107        }

108    }

109}

通过四步,我们视频转换工程就创建完了,这里的主要思路是服务器端调用视频转换工具 ffmpeg.exe,设置参数,通过Main来实现转换。如果有问题请和我联系http://xiucai.cnblogs.com。  
原创粉丝点击