/// <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); } } }
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); } } }
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; } }