Microsoft MVP성태의 닷넷 이야기
글쓴 사람
홈페이지
첨부 파일

AForge.Video.FFMPEG를 최신 버전의 ffmpeg 파일로 의존성을 변경하는 방법

AForge.Video.FFMPEG.dll의 소스 코드는 AForge.NET Framework에 포함되어 있기 때문에 이를 다운로드하면 됩니다.

소스코드 - AForge.NET Framework-2.2.5.zip
; https://code.google.com/archive/p/aforge/downloads
; https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/aforge/AForge.NET%20Framework-2.2.5.zip

압축 해제 후, AForge.Video.FFMPEG 빌드와 관련된 폴더는 다음과 같습니다.

\Externals\ffmpeg - 구 버전의 ffpeg bin, lib, includ 파일 포함
\Sources\Video.FFMPEG - Video.FFMPEG.sln 솔루션 파일까지 포함한 C++/CLI 프로젝트 (x86)

보는 바와 같이 Video.FFMPEG.vcxproj 프로젝트는 \Externals\ffmpeg 폴더 하위에 있는 ffmpeg 라이브러리에 의존성을 갖기 때문에 이 폴더의 내용을 최신으로 업데이트해 주면 됩니다.

(마지막으로 릴리스된) 2.2.5 버전의 AForge.NET Framework에 포함되어 있는 AForge.Video.FFMPEG 프로젝트는 다음의 ffmpeg 라이브러리에 의존성을 갖습니다.

  • avcodec-53.dll
  • avformat-53.dll
  • avutil-51.dll
  • swresample-0.dll
  • swscale-2.dll

그런데 현재(2016-10-29) ffmpeg 3.1.5 버전은,

Download FFmpeg for Windows
; https://ffmpeg.zeranoe.com/builds/

다음의 DLL들로 구성되므로,

  • avcodec-57.dll
  • avformat-57.dll
  • avutil-55.dll
  • swresample-2.dll
  • swscale-4.dll

이를 \Externals\ffmpeg\bin 폴더에 복사해야 할 뿐만 아니라 컴파일을 위해 include, lib 파일들을 구해야 합니다. 이 모든 것은 FFmpeg 라이브러리와, 개발자 용 버전을 통해 구할 수 있습니다.

  • ffmpeg-3.1.5-win32-shared.zip
  • ffmpeg-3.1.5-win32-dev.zip

따라서, AForge Framework의 \Externals\ffmpeg 폴더 내용을 모두 삭제하고, ffmpeg-3.1.5-win32-shared.zip의 압축을 \Externals\ffmpeg 폴더에 풀고, ffmpeg-3.1.5-win32-dev.zip 내용 중에서 "include", "lib" 폴더만 \Externals\ffmpeg 폴더에 넣어 주면 됩니다.



준비는 이것으로 끝났지만, 아쉽게도 하위 호환성이 깨진 부분이 있기 때문에 빌드 시에 맞춰주어야 할 부분이 있습니다.

우선, 다음의 코드에서 오류가 발생할 텐데요.

int video_codecs[] =
{
    libffmpeg::CODEC_ID_MPEG4,
    libffmpeg::CODEC_ID_WMV1,
    libffmpeg::CODEC_ID_WMV2,
    libffmpeg::CODEC_ID_MSMPEG4V2,
    libffmpeg::CODEC_ID_MSMPEG4V3,
    libffmpeg::CODEC_ID_H263P,
    libffmpeg::CODEC_ID_FLV1,
    libffmpeg::CODEC_ID_MPEG2VIDEO,
    libffmpeg::CODEC_ID_RAWVIDEO
};

int pixel_formats[] =
{
    libffmpeg::PIX_FMT_YUV420P,
    libffmpeg::PIX_FMT_YUV420P,
    libffmpeg::PIX_FMT_YUV420P,
    libffmpeg::PIX_FMT_YUV420P,
    libffmpeg::PIX_FMT_YUV420P,
    libffmpeg::PIX_FMT_YUV420P,
    libffmpeg::PIX_FMT_YUV420P,
    libffmpeg::PIX_FMT_YUV420P,
    libffmpeg::PIX_FMT_BGR24,
};

CODEC_ID_???는 AV_CODEC_ID_???로 바꾸고, PIX_FMT_???은 AV_PIX_FMT_???로 바꿔주면 됩니다.

그 외의 함수들 변화는 다음의 글에 따라,

[ffmpeg.git / doc / APIchanges
; http://git.videolan.org/?p=ffmpeg.git;a=blob;f=doc/APIchanges;h=250088b24fd6597bcd3a2b50b53cbfe077d06cef;hb=1985c2e75c607ac51bfd8dc87d2957a5edf2b6f8

이런 식으로 적절하게 바꿔주면 됩니다.

av_open_input_file ==> avformat_open_input
av_find_stream_info ==> avformat_find_stream_info
avcodec_open ==> avcodec_open2
avcodec_alloc_frame ==> av_frame_alloc
av_close_input_file ==> avformat_close_input
av_write_header ==> avformat_write_header
avcodec_encode_video ==> avcodec_encode_video2
av_new_stream ==> avformat_new_stream
av_set_parameters ==> 호출 제거

그런데, 제가 ffmpeg 사용법을 잘 몰라 확신할 수 없는 것이 2가지 있습니다. 하나는 av_set_parameters 같은 경우 대응하는 함수가 없어 제거를 했다는 점과 나머지 하나는 avformat_open_input 함수가 사용법이 달라져서 (ffmpeg를 모르는 상태로) 고쳤다는 점입니다.

특히나 "av_open_input_file" 함수의 경우 "avformat_open_input"으로 대체하는데, 사용 전 반드시 다음과 같이 avformat_alloc_context를 이용해 할당을 해줘야 했습니다. (고맙게도 close 시에 avformat_free_context는 호출하지 않아도 된다고 합니다.)

static libffmpeg::AVFormatContext* open_file( char* fileName )
{
    libffmpeg::AVFormatContext* formatContext = libffmpeg::avformat_alloc_context();

    if ( libffmpeg::avformat_open_input( &formatContext, fileName, NULL, NULL) !=0 )
    {
        return NULL;
    }

    return formatContext;
}

이 정도 변경하고 빌드하면 정상적으로 동작하는 (것 같은) 바이너리를 얻을 수 있습니다.

(첨부 파일은 이 글의 Video.FFMPEG.vcxproj 프로젝트를 포함합니다. 또한 github에도 올려두었습니다.)






[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]





[최초 등록일: ]
[최종 수정일: 11/1/2016 ]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer@outlook.com

비밀번호

댓글 쓴 사람
 




... 31  32  33  34  35  36  37  38  39  40  41  42  43  44  [45]  ...
NoWriterDateCnt.TitleFile(s)
11108정성태11/13/20165931.NET Framework: 624. WPF - Line 요소를 Canvas에 위치시켰을 때 흐림(blur) 현상파일 다운로드1
11107정성태11/10/20166141오류 유형: 371. Post cache substitution is not compatible with modules in the IIS integrated pipeline that modify the response buffers.파일 다운로드1
11106정성태11/8/20167336.NET Framework: 623. C# - PeerFinder를 이용한 Wi-Fi Direct 데이터 통신 예제파일 다운로드1
11105정성태11/8/20165979.NET Framework: 622. PeerFinder Wi-Fi Direct 통신 시 Read/Write/Dispose 문제
11104정성태11/8/20166028개발 환경 구성: 305. PeerFinder로 Wi-Fi Direct 연결 시 방화벽 문제
11103정성태11/8/20165754오류 유형: 370. PeerFinder.ConnectAsync의 결과 값인 Task.Result를 호출할 때 System.AggregateException 예외 발생
11102정성태11/8/20166138오류 유형: 369. PeerFinder.FindAllPeersAsync 호출 시 System.UnauthorizedAccessException 예외 발생
11101정성태11/8/20166790.NET Framework: 621. 닷넷 프로파일러의 오류 코드 - 0x80131363
11100정성태11/7/201610648개발 환경 구성: 304. Wi-Fi Direct 지원 여부 확인 방법 [1]
11099정성태11/7/201611476.NET Framework: 620. C#에서 C/C++ 함수로 콜백 함수를 전달하는 예제 코드파일 다운로드1
11098정성태11/7/20165938오류 유형: 368. 빌드 이벤트에서 robocopy 사용 시 $(TargetDir) 매크로를 지정하는 경우 오류 발생
11097정성태11/7/20166449오류 유형: 367. go install: no install location for directory [...경로...] outside GOPATH
11096정성태12/26/20198444디버깅 기술: 83. PDB 파일을 수동으로 다운로드하는 방법
11095정성태11/6/20166871.NET Framework: 619. C# - Cognitive Services 중의 하나인 Face API를 사용해 얼굴 인식 및 흐림(blur) 효과 적용파일 다운로드1
11094정성태11/6/20168914VC++: 105. Visual Studio 2013/2015 - Ceemple OpenCV 확장을 이용한 웹캠 영상 출력
11093정성태11/4/20168491웹: 34. Edge 브라우저도 지원하는 클립보드 복사를 위한 자바스크립트 코드
11092정성태11/3/201612487.NET Framework: 618. C# - NAudio를 이용한 MP3 파일 재생 [4]파일 다운로드1
11091정성태11/3/20168885VC++: 104. std::call_once를 이용해 thread-safe한 Singleton 객체 생성파일 다운로드1
11090정성태10/19/20199922VC++: 103. C++ CreateTimerQueue, CreateTimerQueueTimer 예제 코드파일 다운로드1
11089정성태11/1/20169520디버깅 기술: 82. Windows 10을 위한 Symbol(PDB) 파일 내려받는 방법 [2]
11088정성태11/1/201612345.NET Framework: 617. C# - AForge.NET을 이용한 MP4 동영상 파일 재생 [5]파일 다운로드1
11087정성태11/1/20169562.NET Framework: 616. AForge.Video.FFMPEG를 최신 버전의 ffmpeg 파일로 의존성을 변경하는 방법파일 다운로드1
11086정성태11/1/20165459오류 유형: 366. The Microsoft Passport Container service terminated with the following error: General access denied error
11085정성태10/27/201614217.NET Framework: 615. C# - AForge.NET을 이용한 웹캠 영상 출력 [2]파일 다운로드1
11084정성태10/26/20165582오류 유형: 365. The User Profile Service service failed to the sign-in.
11083정성태10/26/201610418Windows: 131. 윈도우 10에서 사라진 "Adapters and Bindings" 네트워크 우선 순위 조정 기능 [1]
... 31  32  33  34  35  36  37  38  39  40  41  42  43  44  [45]  ...