C# - AForge.NET을 이용한 MP4 동영상 파일 재생
AForge.NET에는 Video 파일 처리와 관련해 2개의 라이브러리가 있습니다.
- AForge.Video.DirectShow
- AForge.Video.FFMPEG
DirectShow를 이용한 경우, AVI 파일과 같은 것만 재생할 수 있을 뿐 MP4 등의 파일을 재생하려고 하면 "Did not find acceptable output video pin in the given source AForge.NET"와 같은 예외가 발생합니다.
예상할 수 있듯이 MP4 파일 등의 재생은 AForge.Video.FFMPEG로 해야 합니다. 이 때문에 의존성이 좀 복잡해지는데요. 우선 기본적인 것은 NuGet으로 해결하고,
Install-Package AForge.Controls
AForge.Video.FFMPEG.dll은 "AForge.NET Framework"을 내려받아 그 안에서 구해야 합니다.
AForge.NET Framework is 2.2.5.
; http://www.aforgenet.com/framework/downloads.html
(2.2.5 버전에 포함된 AForge.Video.FFMPEG 프로젝트는 예전 버전의 ffmpeg 라이브러리에 의존합니다. 만약 이를 바꾸고 싶다면 "
AForge.Video.FFMPEG를 최신 버전의 ffmpeg 파일로 의존성을 변경하는 방법"을 참고하세요.)
이렇게 참조를 해결하면 이제 나머지 작업은
지난번과 마찬가지로 어렵지 않습니다.
이번엔 PictureBox 대신 AForge.Controls에서 제공하는 AForge.Controls.VideoSourcePlayer 컨트롤을 WinForm 위에 올리고, 다음과 같이 mp4 비디오 파일 경로를 VideFileSource에 제공하는 것으로 동영상 재생을 할 수 있습니다.
VideoFileSource _videoFile;
private void button1_Click(object sender, EventArgs e)
{
if (this.button1.Text == "Start")
{
string filePath = @"F:\frozen\IdinaMenzel.mp4";
_videoFile = new VideoFileSource(filePath);
this.videoSourcePlayer1.VideoSource = _videoFile;
this.videoSourcePlayer1.Start();
this.button1.Text = "Stop";
}
else
{
this.button1.Text = "Start";
_videoFile.Stop();
}
}
아래는 실행 화면을 보여줍니다.
(
첨부 파일은 이 글의 예제를 포함합니다.)
유의할 것은, AForge.Video.FFMPEG 라이브러리는 오로지 "영상"만을 재생할 뿐 음성 데이터는 처리하지 않습니다. (즉, 소리가 들리지 않습니다.) AForge 2.2.5 라이브러리 당시 AForge.Video.FFMPEG에서는 음성 처리에 대한 지원을 추가할 생각이 없다고 분명히 밝혔기 때문에 향후로도 그럴 가능성은 별로 없어 보입니다.
// AForge.Video.FFMPEG Namespace
// http://www.aforgenet.com/framework/docs/html/e478f635-9b18-278b-8378-99e5531b3007.htm
Note: the API allows writing and reading video data only. Reading and writing of sound data is not supported and is not planned for now.
만약 아래와 같은 오류가 발생한다면?
System.IO.FileNotFoundException was unhandled
FileName=AForge.Video.FFMPEG.dll
FusionLog=""
HResult=-2147024770
Message=Could not load file or assembly 'AForge.Video.FFMPEG.dll' or one of its dependencies. The specified module could not be found.
Source=WindowsFormsApplication1
StackTrace:
at WindowsFormsApplication1.Form1.Form1_Load(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EveArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
InnerException:
에러 메시지처럼 EXE 파일이 있는 폴더에 AForge.Video.FFMPEG.dll 파일이 없기 때문일 수도 있지만, FFMPEG 관련 라이브러리가 없는 경우일 수도 있습니다. 실제로 AForge.Video.FFMPEG.dll 파일은 avformat-??.dll, avcodec-??.dll, avutil-??.dll, swscale-?.dll에 대한 직접적인 의존성을 가지고 있습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]