最近遇到公司的一個項目,需要將多張圖片合併成一個播放的視頻,找了很多資料和嘗試了工具,遇到很多的坑,這裡記下來,希望大家也能順利解決遇到的問題。 合併視頻,主要可以借用OpenCV 和 ffmpeg,這裡是嘗試用ffmpeg.exe的工具去實現圖片文件合併成視頻。 輸入存儲視頻文件的路徑,通過Pro ...
最近遇到公司的一個項目,需要將多張圖片合併成一個播放的視頻,找了很多資料和嘗試了工具,遇到很多的坑,這裡記下來,希望大家也能順利解決遇到的問題。
合併視頻,主要可以借用OpenCV 和 ffmpeg,這裡是嘗試用ffmpeg.exe的工具去實現圖片文件合併成視頻。
輸入存儲視頻文件的路徑,通過ProcessStartInfo 調用ffmpeg.exe軟體啟動合併圖片操作,併在startInfo.Arguments寫入控制指令。
#region 圖片轉視頻
public void ImageGetVideo()
{
string ffmpeg = string.Format("{0}ffmpeg.exe", AppDomain.CurrentDomain.BaseDirectory);
try
{
string videoFile = MP4Path.Text + @"test.mp4 "; //創建視頻文件命
if (File.Exists(videoFile))
{
File.Delete(videoFile);
}
this.KillProcess("ffmpeg"); //註意,進程名字不帶.exe之類尾碼
ProcessStartInfo startInfo = new ProcessStartInfo(ffmpeg);
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
// -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg //這是把視頻轉圖片的
//及其耗CUP的指定幀截取圖片幀 string.Format(" -i \"{0}\" -y -f image2 -ss {1} -s \"{2}\" \"{3}\"", vedioPath, catchTime, saveImgSize, saveImgPath)
//string param = string.Format(" -f image2 -i " + txtPath.Text + @"\%d.jpg -vcodec libx264 -r 10 " + MP4Path.Text + @"\test.mp4 ");
string param = string.Format(" -f image2 -r (1/3) -i " + txtPath.Text + @"\%d.jpg -vf fps=12 " + MP4Path.Text + @"\test.mp4 ");
//param = param + string.Format(" ffplay -i " + MP4Path.Text + @"\test.mp4 -vf setpts=PTS/(1/16)");
startInfo.Arguments = param;
System.Diagnostics.Process.Start(startInfo).Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return;
}
}
#endregion
指令註意:
" -f image2 -i " + (圖片文件地址)+ @"\%d.jpg -vcodec libx264 -r 10 " + (視頻文件地址)+ @"\test.mp4 " ,最後面的是存放視頻的文件名稱,註意這裡放的圖片序號一定要是連續的(例:1.jpg,2.jpg,3.jpg....),不然合併不成功,這裡設置的播放圖片的時間間隔是3S,並且合併圖片最好在第一張圖片放一張黑色底圖,第一張圖片切到第二圖片,沒有時間間隔,容易一閃而過,放一張黑色底圖,序號改成1.jpg,可以不影響後面圖片的播放。