이제 비주얼 스튜디오를 이용하여 프로그램을 만들어야 겠죠 +_+
저는 VS Dot Net 2003에서 만들었습니다.
프로그램은 졸업 논문의 부분으로 부가기능으로 해놔서 공개하기가 좀 ㅡㅡㅋ
여기서는 자신의 프로젝트에 생성된 dll 사용 방법과 extern 방법 그리고 사용시 발생하는 오류중에 몇가지 생각나는데로 해결 방법만을 살짝 적어볼랍니다 ^^
고고싱~
1. Visual Studio에 dll 사용 방법
① 생성된 솔루션을 열고 목록에서 프로젝트->프로젝트명의속성
② C/C++ 항목 -> 일반에서 추가 디렉토리 C:\msys\local\include
③ 링커 항목 -> 일반에서 추가 라이브러리 디렉토리 c:\msys/local\bin
④ 링커 항목 ->입력에서 추가 종속성 avutil,avcodec,avformat lib 추가 (참고. 보통 avutil.lib, avcodec.lib, avformat.lib로 생된다고 하나 lib와 dll의 이름이 뒤에 –버전이 붙을 수 도 있으니 확인 후 입력)
⑤ 이 후 필요한 헤더 파일 및 동적 링크는 알아서 추가 시켜야 함.
2. 프로젝트 예
#include <math.h>
#include <ffmpeg/inttypes.h>
#include <stdint.h>
extern "C" __declspec(dllimport) void av_free(void *);
extern "C" __declspec(dllimport) int avcodec_close(struct AVCodecContext *);
extern "C" __declspec(dllimport) int avcodec_encode_audio(struct AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples);
extern "C" __declspec(dllimport) int avcodec_open(struct AVCodecContext *avctx, struct AVCodec *codec);
extern "C" __declspec(dllimport) AVCodecContext *avcodec_alloc_context(void);
extern "C" __declspec(dllimport) AVCodec *avcodec_find_encoder(enum CodecID id);
extern "C" __declspec(dllimport) int avcodec_decode_audio(struct AVCodecContext *avctx, int16_t *samples,int *frame_size_ptr, uint8_t *buf, int buf_size);
extern "C" __declspec(dllimport) AVCodec *avcodec_find_decoder(enum CodecID id);
extern "C" __declspec(dllimport) int avcodec_encode_video(struct AVCodecContext *avctx, uint8_t *buf, int buf_size, const struct AVFrame *pict);
extern "C" __declspec(dllimport) AVFrame *avcodec_alloc_frame(void);
extern "C" __declspec(dllimport) int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, uint8_t *buf, int buf_size);
extern "C" __declspec(dllimport) void avcod ec_register_all(void);
extern "C" __declspec(dllimport) void avcodec_init(void);
#include <ffmpeg/avcodec.h>
#include <ffmpeg/avformat.h>
#include <ffmpeg/avutil.h>
#define INBUF_SIZE 4096
è 이런 식으로 사용 각 함수 사용 가능 해 짐.
환경에 따른 많은 오류가 발생한다…
오류에 따른 몇가지 처리는 다음과 같이 하면 해결 가능
1. 각 케스팅 타입은 전통 C 타입으로 한다.(void *의 반환 타입 에러)
2. #define AV_NOPTS_VALUE INT54_C(0x8000000000000000)에러 메시지는
#define __STDC_CONSTANT_MACROS를 추가 하여 준다.
3. Inttypes.h 파일 요구는 위의 과정에서 확인한다.
4. Enum 에러는 정수 형태로 대입이 불가능 하므로 enum CodecID 에서의 CodecID를 통하여 해당 정수를 캐스팅 해 준다.
5. Snprintf는 _snprintf로 변경 해 준다.
제가 프로젝트를 작성하면서 제작한 메뉴얼을 4단계로 나누어서 이렇게 올려보았습니다 ^^; 막막한 프로그래밍에 한줄기 빛이 되시길 희망합니다 ^^ 그럼 다들 즐프~