131 lines
5.0 KiB
C#
131 lines
5.0 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Text.RegularExpressions;
|
|
using System.Windows.Forms;
|
|
using AviFile;
|
|
using CdgLib;
|
|
|
|
namespace KaraokeConverter
|
|
{
|
|
public class ExportAVI
|
|
{
|
|
public delegate void StatusEventHandler(string message);
|
|
|
|
|
|
public void CDGtoAVI(string aviFileName, string cdgFileName, string mp3FileName, double frameRate,
|
|
string backgroundFileName = "")
|
|
{
|
|
Bitmap backgroundBmp = null;
|
|
Bitmap mergedBMP = null;
|
|
VideoStream aviStream = null;
|
|
var myCDGFile = new GraphicsFile(cdgFileName, FileMode.Open, FileAccess.Read);
|
|
myCDGFile.RenderAtPosition(0);
|
|
var bitmap__1 = (Bitmap) myCDGFile.RgbImage;
|
|
if (!string.IsNullOrEmpty(backgroundFileName))
|
|
{
|
|
try
|
|
{
|
|
if (IsMovie(backgroundFileName))
|
|
backgroundBmp = MovieFrameExtractor.GetBitmap(0, backgroundFileName, GraphicsFile.FullWidth,
|
|
GraphicsFile.FullHeight);
|
|
if (IsGraphic(backgroundFileName))
|
|
backgroundBmp = GraphicUtil.GetCdgSizeBitmap(backgroundFileName);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
}
|
|
}
|
|
var aviManager = new AviManager(aviFileName, false);
|
|
if (backgroundBmp != null)
|
|
{
|
|
mergedBMP = GraphicUtil.MergeImagesWithTransparency(backgroundBmp, bitmap__1);
|
|
aviStream = aviManager.AddVideoStream(true, frameRate, mergedBMP);
|
|
mergedBMP.Dispose();
|
|
if (IsMovie(backgroundFileName))
|
|
backgroundBmp.Dispose();
|
|
}
|
|
else
|
|
{
|
|
aviStream = aviManager.AddVideoStream(true, frameRate, bitmap__1);
|
|
}
|
|
|
|
var count = 0;
|
|
var frameInterval = 1000/frameRate;
|
|
var totalDuration = myCDGFile.GetTotalDuration();
|
|
double position = 0;
|
|
while (position <= totalDuration)
|
|
{
|
|
count += 1;
|
|
position = count*frameInterval;
|
|
myCDGFile.RenderAtPosition(Convert.ToInt64(position));
|
|
bitmap__1 = (Bitmap) myCDGFile.RgbImage;
|
|
if (!string.IsNullOrEmpty(backgroundFileName))
|
|
{
|
|
if (IsMovie(backgroundFileName))
|
|
backgroundBmp = MovieFrameExtractor.GetBitmap(position/1000, backgroundFileName,
|
|
GraphicsFile.FullWidth, GraphicsFile.FullHeight);
|
|
}
|
|
if (backgroundBmp != null)
|
|
{
|
|
mergedBMP = GraphicUtil.MergeImagesWithTransparency(backgroundBmp, bitmap__1);
|
|
aviStream.AddFrame(mergedBMP);
|
|
mergedBMP.Dispose();
|
|
if (IsMovie(backgroundFileName))
|
|
backgroundBmp.Dispose();
|
|
}
|
|
else
|
|
{
|
|
aviStream.AddFrame(bitmap__1);
|
|
}
|
|
bitmap__1.Dispose();
|
|
var percentageDone = (int) (position/totalDuration*100);
|
|
if (Status != null)
|
|
{
|
|
Status(percentageDone.ToString());
|
|
}
|
|
Application.DoEvents();
|
|
}
|
|
myCDGFile.Dispose();
|
|
aviManager.Close();
|
|
if (backgroundBmp != null)
|
|
backgroundBmp.Dispose();
|
|
AddMP3toAVI(aviFileName, mp3FileName);
|
|
}
|
|
|
|
public static void AddMP3toAVI(string aviFileName, string mp3FileName)
|
|
{
|
|
/*
|
|
string newAVIFileName = Regex.Replace(aviFileName, "\\.avi$", "MUX.avi", RegexOptions.IgnoreCase);
|
|
string cmdLineArgs = "-ovc copy -oac copy -audiofile \"" + mp3FileName + "\" -o \"" + newAVIFileName + "\" \"" + aviFileName + "\"";
|
|
using (Process myProcess = new Process()) {
|
|
string myCMD = "\"" + System.AppDomain.CurrentDomain.BaseDirectory() + "mencoder.exe \"" + cmdLineArgs;
|
|
myProcess.StartInfo.FileName = "\"" + System.AppDomain.CurrentDomain.BaseDirectory() + "mencoder.exe\"";
|
|
myProcess.StartInfo.Arguments = cmdLineArgs;
|
|
myProcess.StartInfo.UseShellExecute = false;
|
|
myProcess.StartInfo.CreateNoWindow = true;
|
|
myProcess.Start();
|
|
myProcess.PriorityClass = ProcessPriorityClass.Normal;
|
|
myProcess.WaitForExit();
|
|
}
|
|
if (File.Exists(newAVIFileName)) {
|
|
File.Delete(aviFileName);
|
|
File.Move(newAVIFileName, aviFileName);
|
|
}
|
|
*/
|
|
}
|
|
|
|
public static bool IsMovie(string filename)
|
|
{
|
|
return Regex.IsMatch(filename, "^.+(\\.avi|\\.mpg|\\.wmv)$", RegexOptions.IgnoreCase);
|
|
}
|
|
|
|
public static bool IsGraphic(string filename)
|
|
{
|
|
return Regex.IsMatch(filename, "^.+(\\.jpg|\\.bmp|\\.png|\\.tif|\\.tiff|\\.gif|\\.wmf)$",
|
|
RegexOptions.IgnoreCase);
|
|
}
|
|
|
|
public event StatusEventHandler Status;
|
|
}
|
|
} |