Beispiel #1
0
 /// <summary>
 /// 根据视频的时长处理对应的音频,或重复播放音乐或裁减音乐
 /// </summary>
 /// <param name="musicPath"></param>
 /// <param name="length"></param>
 /// <param name="outputFile"></param>
 public void CreateMusic(string musicPath, string length, string outputFile, int counter = 0)
 {
     counter++;
     CommonFile.FileAttributes musicFileAtributes = CommonFile.GetFileAttributes(musicPath);
     if (musicFileAtributes != null && !string.IsNullOrEmpty(musicFileAtributes.Length))
     {
         DateTime dtMusic = DateTime.Parse(musicFileAtributes.Length);
         DateTime dtVideo = DateTime.Parse(length);
         if (dtMusic < dtVideo)
         {
             string tempPath = string.Format("{0}\\tempaddmusic{1}.mp3", WorkPath, counter);
             AddMusic(string.Format("{0}+{0}", musicPath), tempPath);
             string lenSource = CommonFile.GetFileAttributes(musicPath).Length;
             string lenDest   = CommonFile.GetFileAttributes(tempPath).Length;
             if (lenSource != lenDest) //相同表示转化失败
             {
                 CreateMusic(tempPath, length, outputFile, counter);
             }
         }
         else
         {
             SubMusic(musicPath, length, outputFile);
         }
     }
 }
Beispiel #2
0
        private void btnTestMusic_Click(object sender, EventArgs e)
        {
            string inputMusic  = txtMusicPath.Text;
            string outputMusic = string.Format("{0}\\testMusic.mp3", AppDomain.CurrentDomain.BaseDirectory);
            string tempMusic   = string.Empty;

            try
            {
                if (!System.IO.File.Exists(inputMusic) && Directory.Exists(inputMusic))
                {
                    tempMusic = string.Format("{0}\\testMusicTemp.mp3", AppDomain.CurrentDomain.BaseDirectory);
                    AddDirMusic(inputMusic, tempMusic);
                    inputMusic = tempMusic;
                }
                CreateMusic(inputMusic, "00:20:00", outputMusic);
                if (System.IO.File.Exists(outputMusic))
                {
                    CommonFile.FileAttributes outputMusicAtributes = CommonFile.GetFileAttributes(outputMusic);
                    txtMessage.Text = string.Format("音乐合成成功!音乐时长:" + outputMusicAtributes.Length);
                    System.IO.File.Delete(outputMusic);
                }
                else
                {
                    txtMessage.Text = string.Format("音乐合成失败!");
                }
            }
            catch (Exception ex)
            {
                txtMessage.Text = string.Format("音乐合成失败,异常信息:{0}", ex.Message);
            }
            finally
            {
                if (System.IO.File.Exists(tempMusic))
                {
                    System.IO.File.Delete(tempMusic);
                }
            }
        }
Beispiel #3
0
        private void btnCreate_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtFoldPath.Text == txtTempPath.Text)
                {
                    MessageBox.Show("图片文件目录不允许和工作目录重复!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                txtMessage.Text = string.Empty;
                Message         = string.Empty;
                //必须得有临时目录, 如果给定的目录不存在,则自动创建
                if (!string.IsNullOrEmpty(txtTempPath.Text))
                {
                    WorkPath = txtTempPath.Text;
                }
                string tempNoMusicVideo = string.Format("{0}\\temp.avi", WorkPath);                                //无音乐的临时avi
                string tempInMusicVideo = string.Format("{0}\\temp2.avi", WorkPath);                               // 加入了音乐的视频
                string tempOutputVideo  = string.Format("{0}\\temp3.avi", WorkPath);                               //可作为输出的AVI
                string outputVideo      = string.Format("{0}\\{1}.{2}", txtOutputPath.Text, txtTitle.Text, "avi"); //视频输出路径
                //计时开始
                DateTime dtCreateBegin = DateTime.Now;
                AddMessage(string.Format("开始生成,当前时间:{0}", dtCreateBegin.ToString("HH:mm:ss")));  ///Message 1
                //当目录存在并且当前不是重新生成的时候需要清理目录
                if (Directory.Exists(WorkPath) && !chbReCreate.Checked)
                {
                    Directory.Delete(WorkPath, true);
                    Directory.CreateDirectory(WorkPath);
                }
                else if (!Directory.Exists(WorkPath))
                {
                    Directory.CreateDirectory(WorkPath);
                }
                string imagePath = WorkPath;
                if (!chbQuicCreate.Checked) //不转码图片直接生成
                {
                    //图片目录
                    if (!Directory.Exists(txtFoldPath.Text))
                    {
                        AddMessage("图片目录不存在!");  ///Message 2
                        return;                  //=================================return
                    }
                    //拷贝图片文件到工作目录,并根据指定的分辨率转码,以高为基准
                    AddMessage("拷贝图片到工作目录...");    ///Message 3
                    int imageCount = CopyImage(txtFoldPath.Text, WorkPath, !chbReCreate.Checked);
                    if (imageCount == 0)
                    {
                        AddMessage("图片拷贝失败!");  ///Message 4
                        return;                 //=================================return
                    }
                    //如果有封面和封底则生成封面
                    if (!string.IsNullOrEmpty(txtCover.Text) && System.IO.File.Exists(txtCover.Text))
                    {
                        CompressImage(txtCover.Text, string.Format("{0}\\0.jpg", WorkPath));
                        if (Convert.ToInt32(cbSpeed.SelectedItem) < 5) //如果速度小于五秒为了多显示封面,重新拷贝一遍
                        {
                            System.IO.File.Copy(string.Format("{0}\\0.jpg", WorkPath), string.Format("{0}\\00.jpg", WorkPath), true);
                        }
                    }
                    if (!string.IsNullOrEmpty(txtCoverBack.Text) && System.IO.File.Exists(txtCoverBack.Text))
                    {
                        string[] imageList = Directory.GetFiles(WorkPath);
                        CompressImage(txtCoverBack.Text, string.Format("{0}\\{1}.jpg", WorkPath, imageCount));
                    }
                    //生成视频文件
                    AddMessage(string.Format("{0}张图片拷贝完毕,开始生成视频...", imageCount));  ///Message 5
                }
                else
                {
                    imagePath = txtFoldPath.Text;
                }
                //图片之间的转化速度最后转化为framerate
                CreateVideo(imagePath, tempNoMusicVideo, Convert.ToDouble(cbSpeed.SelectedItem.ToString()));
                //第一次生成失败,则重试
                if (!System.IO.File.Exists(tempNoMusicVideo))
                {
                    CreateVideo(WorkPath, tempNoMusicVideo, Convert.ToDouble(cbSpeed.SelectedItem.ToString()));
                }
                //第二次生成失败则退出
                if (!System.IO.File.Exists(tempNoMusicVideo))
                {
                    AddMessage("视频生成失败");   ///Message 6
                    return;                 //=================================return
                }
                //处理视频信息
                AddVideoMetadata(tempNoMusicVideo, tempOutputVideo, txtTitle.Text);
                //合并音乐和视频,并按照输入的标题重命名文件
                AddMessage("视频生成完毕,开始生成音乐。。。");     ///Message 7

                string inputMusic = string.Format("{0}\\temp.mp3", WorkPath);
                //视频的长度固定音乐的长度,多了截取,短了重复音乐
                CommonFile.FileAttributes videoFileAtributes = CommonFile.GetFileAttributes(tempNoMusicVideo);
                //如果是音乐目录,则先合并音乐
                string musicPath = txtMusicPath.Text;
                if (!System.IO.File.Exists(musicPath) && Directory.Exists(musicPath))
                {
                    string tempMusic = string.Format("{0}\\dirMusicTemp.mp3", WorkPath);
                    AddDirMusic(musicPath, tempMusic);
                    musicPath = tempMusic;
                }
                if (System.IO.File.Exists(musicPath))
                {
                    CreateMusic(musicPath, videoFileAtributes.Length, inputMusic);
                }
                //如果输出目录不存在,则创建
                if (!Directory.Exists(txtOutputPath.Text))
                {
                    Directory.CreateDirectory(txtOutputPath.Text);
                }
                //确定音乐正常的生成
                if (System.IO.File.Exists(inputMusic))
                {
                    AddMessage("音乐生成完毕,开始合成视频和音乐");     ///Message 8
                    MixAudioAndVideo(inputMusic, tempOutputVideo, tempInMusicVideo);
                }
                else
                {
                    AddMessage("音乐生成失败,输出视频");     ///Message 9
                    System.IO.File.Copy(tempNoMusicVideo, tempInMusicVideo);
                }
                //加入视频信息
                AddMessage("处理视频信息"); ///Message 11
                //AddVideoMetadata(tempInMusicVideo, tempOutputVideo,txtTitle.Text); //加入元数据有问题
                tempOutputVideo = tempInMusicVideo;
                //拷贝视频到用户指定的目录
                System.IO.File.Copy(tempOutputVideo, outputVideo, true);
                //清除过程中的临时文件和目录
                if (chbAutoClear.Checked)
                {
                    Directory.Delete(WorkPath, true);
                }
                DateTime dtCreateEnd = DateTime.Now;
                TimeSpan ts          = dtCreateEnd - dtCreateBegin;
                AddMessage(string.Format("生成成功!用时{0}分钟", Convert.ToInt32(ts.TotalMinutes)));    ///Message 11
            }
            catch (Exception ex)
            {
                AddMessage(ex.Message);
                txtMessage.Text = Message;
            }
        }