성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>FFmpeg.exe를 이용한 C# 동영상 인코더 예제</h1> <p> 참고로, 이번 내용은 다음의 글을 읽고 작성한 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Creating a Video Converter Using VB.NET ; <a target='tab' href='http://www.codeguru.com/vb/gen/vb_multimedia/article.php/c19683'>http://www.codeguru.com/vb/gen/vb_multimedia/article.php/c19683</a> </pre> <br /> 마침 질문 주신 분도 있고 해서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > FFmpeg 사용해 보신 분 좀 도와주세요 ; <a target='tab' href='http://mblog.devpia.com/link/?no=2124351'>http://mblog.devpia.com/link/?no=2124351</a> </pre> <br /> VB.NET으로 된 예제를 C#으로 작성해 보았습니다. 그런데, 음... 구 버전의 ffmpeg.exe를 써서 그런지 저대로 코딩하거나 글에 포함된 소스코드를 다운로드해도 정상적으로 동작하지 않습니다.<br /> <br /> 그래서, 제 경우에는 위의 것을 그대로 따라하지 않고 최대한 단순화 시키면서 '동작 가능한 버전'으로 만들어 보았습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 우선, ffmpeg.exe 파일을 구해야 하는데 다음의 사이트에서 다운로드 할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > FFmpeg ; <a target='tab' href='http://ffmpeg.org/'>http://ffmpeg.org/</a> </pre> <br /> 소스 코드를 직접 빌드해도 되지만, FFmpeg 윈도우 빌드를 다음의 경로에서 다운로드하는 것도 가능합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > FFmpeg Windows Builds ; <a target='tab' href='http://ffmpeg.zeranoe.com/builds/'>http://ffmpeg.zeranoe.com/builds/</a> </pre> <br /> 이 글에서는 위의 사이트에서 다운로드한 32/64-bit builds(static) 버전으로 진행하겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > FFmpeg git-dd1fb65 64-bit Static (Latest)(2011-12-22) ; <a target='tab' href='http://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-git-dd1fb65-win64-static.7z'>http://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-git-dd1fb65-win64-static.7z</a> FFmpeg git-dd1fb65 32-bit Static (Latest)(2011-12-22) ; <a target='tab' href='http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-git-dd1fb65-win32-static.7z'>http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-git-dd1fb65-win32-static.7z</a> </pre> <br /> 위의 ffmpeg.exe를 구했으면 이제 나머지는 아주 초보적인 코딩에 불과합니다. 왜냐하면, ffmpeg.exe를 외부 프로세스로 호출하고 변환할 것이므로 단순히 명령행 인자만 적절하게 구성해서 전달해 주면 되기 때문입니다.<br /> <br /> 우선 명령행에서 간단하게 테스트해 보는 것이 좋은데요.<br /> <br /> 대충 예제를 맞추기 위해서 다음과 같은 옵션들을 선택할 수 있었습니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> <span style='color: blue; font-weight: bold'>-b:v</span> video bitrate<br /> 64k, 96k, 128k, 192k, 256k, 320k, 340k<br /> <br /> <span style='color: blue; font-weight: bold'>-s</span> frame size<br /> wvga, ... hd420,...<br /> <br /> <span style='color: blue; font-weight: bold'>-ar</span> audio sampling frequency<br /> 11025<br /> 22050<br /> 44100<br /> <br /> <span style='color: blue; font-weight: bold'>-qscale</span> Use fixed quality scale (VBR). The meaning of q is codec-dependent.<br /> To have a constant quality (but a variable bitrate), use the option ’-qscale n’ when ’n’ is between 1 (excellent quality) and 31 (worst quality).<br /> <br /> 이 외의 좀 더 다양한 옵션에 대해서는 다음의 링크를 참고하세요.<br /> <br /> ffmpeg Documentation<br /> ; <a target='tab' href='http://ffmpeg.org/ffmpeg.html'>http://ffmpeg.org/ffmpeg.html</a><br /> </div><br /> <br /> 그래서, 플래시 파일을 MP4로 변환하는 것은 다음과 같이 해줄 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ffmpeg.exe <span style='color: blue; font-weight: bold'>-i</span> "D:\temp\sample.flv" <span style='color: blue; font-weight: bold'>-b:v</span> 340k <span style='color: blue; font-weight: bold'>-y</span> "D:\temp\sample.mp4" <span style='color: blue; font-weight: bold'>-s</span> hd480 <span style='color: blue; font-weight: bold'>-ar</span> 44100 </pre> <br /> C#에서는 Process.Start로 실행시켜 주기만 하면 끝이겠지요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ProcessStartInfo psiProcInfo = new ProcessStartInfo(); StreamReader srFFMPEG; string strFFMPEGCmd = " -i \"" + srcFile + "\" -ar 44100 " + videoRateOption + videoSizeOption + " -y \"" + dstFile + "\""; psiProcInfo.FileName = Application.StartupPath + ((IntPtr.Size == 8) ? "\\x64" : "\\x86") + "\\ffmpeg.exe"; psiProcInfo.Arguments = strFFMPEGCmd; psiProcInfo.UseShellExecute = false; psiProcInfo.WindowStyle = ProcessWindowStyle.Hidden; psiProcInfo.RedirectStandardError = true; psiProcInfo.RedirectStandardOutput = true; prcFFMPEG.StartInfo = psiProcInfo; prcFFMPEG.Start(); </pre> <br /> 그런데... 혹시 '진행율'을 표시하는 것이 가능할까요? 일단, 외부 프로세스를 실행하는 것이라서 별도의 이벤트가 제공되지 않는 한 불가능합니다. 이를 위해서는 FFmpeg 라이브러리 수준으로 사용해서 직접 API를 제어하는 것으로 가능할 텐데요.<br /> <br /> 그래도, 일단 아쉬운 대로 FFmpeg.exe의 출력 결과를 보면 어느 정도 예측하는 것은 가능합니다. 예를 들어 아래의 실행 결과를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > D:\temp>ffmpeg.exe -i "D:\temp\videoplayback.flv" -b:v 340k -y "D:\temp\videoplayback.mp4" -s hd480 -ar 44100 -pass 2 ...[생략]... Input #0, flv, from 'D:\temp\videoplayback.flv': Metadata: starttime : 0 totalduration : 238 totaldatarate : 478 bytelength : 14186363 canseekontime : true sourcedata : B4A7DD5C6MH1324909622848868 purl : pmsg : <span style='color: blue; font-weight: bold'>Duration: 00:03:57.50</span>, start: 0.000000, bitrate: 477 kb/s Stream #0:0: Video: h264 (Main), yuv420p, 640x360, 348 kb/s, 29.97 tbr, 1k tbn, 59.94 tbc Stream #0:1: Audio: aac, 44100 Hz, stereo, s16, 131 kb/s ...[생략]... Press [q] to stop, [?] for help frame= 7119 fps=166 q=-1.0 Lsize= 13720kB <span style='color: blue; font-weight: bold'>time=00:03:57.47</span> bitrate= 473.3kbits/s video:9777kB audio:3711kB global headers:0kB muxing overhead 1.722711% ...[생략]... </pre> <br /> Input #0 FLV 파일의 Duration을 03:57.50으로 출력해 주고 있기 때문에 이 값을 보관하고 있다가 이 후에 인코딩 시에 출력해 주는 time=... 값을 비교해서 백분율을 내면 진행 상태를 출력해 줄 수 있는 것입니다.<br /> <br /> <a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?wid=1210&boardid=331301885'>첨부된 파일은 위의 코드를 포함한 예제 프로젝트</a>이고, 클릭원스로도 올려놓았으니 원하시는 분들은 간단하게 테스트하실 수 있을 것입니다. (참고로, 입력 파일은 플래시 확장자(.flv)로 제한했습니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > FLV 동영상 변환 ; <a target='tab' href='http://www.sysnet.pe.kr/temp/app/vencoder/VEncoder.application'>http://www.sysnet.pe.kr/temp/app/vencoder/VEncoder.application</a> </pre> <br /> 64비트 PC에서는 64비트 버전의 ffmpeg.exe를 사용하고, 32비트 PC에서는 32비트 버전의 ffmpeg.exe를 사용해서 인코딩합니다.<br /> <br /> <img alt='ffmpeg_cs_1.png' src='/SysWebRes/bbs/ffmpeg_cs_1.png' /><br /> <br /> 그 유명한 "<a target='tab' href='http://tvpot.daum.net/application/PotEncoder.do'>다음 팟 인코더</a>"도 결국 FFmpeg 라이브러리를 이용한 것이기 때문에, 위의 응용 프로그램과 비교해서 동영상 인코딩 품질은 동일합니다. ^^<br /> </p><br /> <br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1901
(왼쪽의 숫자를 입력해야 합니다.)