검색결과 리스트
프로그래밍/FFMPEG 에 해당되는 글 7건
- 2015.07.30 FFMpeg 빌드시 UINT64_C 에러 처리 방법
- 2015.07.23 FFMpeg으로 프레임 저장 구현하기
- 2015.07.23 FFMpeg 라이브러리 파일 링크하기
- 2015.07.15 동영상 파일 기초
- 2015.07.14 SDL 추가에서 main 에러 날 때 해결 방법 2
- 2015.07.09 FFMPEG 구현을 위한 동영상 파일 기본 구성 요소 용어 정의
- 2015.07.09 FFMPEG 기본 함수
libavutil/common.h:165: error:'UINT64_C' was not declared in this scope
위와 같은 에러를 만나면 common.h 소스에 아래 코드 추가
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
지금 구현하는 프로그램은 동영상 파일을 입력 받아 처음의 다섯 프레임을 ppm 파일로 저장하는 프로그램이다
프로그램의 큰 흐름은 다음과 같다
- 파일을 연다. - FileOpen( )
- 스트림의 정보를 얻는다. - GetStreamInformation( )
- 코텍을 찾는다 - FindCodec( )
- 디코딩한다 - Decode( )
Streamer 클래스를 선언하고 다음과 같이 구현한다
생성자 멤버 변수는 생성자에서 다음과 같이 설정한다
소멸자는 다음과 같이 구현한다
파일을 여는 함수는 다음과 같이 구현한다
스트림의 정보를 얻는 함수는 다음과 같이 구현한다
코덱을 찾는 함수는 다음과 같이 구현한다
디코딩하는 함수는 다음과 같이 구현한다
프레임을 저장하는 함수는 다음과 같이 구현한다
미디어 타입을 문자열로 변환하는 함수는 다음과 같이 구현한다
나머지 하나의 함수는 다음과 같이 구현한다
main( ) 함수는 다음과 같이 구현한다
FFMPEG 라이브러리 파일 다운로드
위의 링크로 들어가서 빌드된 다음 파일을 다운 받는다
파일을 다운 받은 후 압축을 푼다
Shared 폴더 안에서 bin 파일을 복사하여 링크를 한다
Dev 폴더 안에서 include, lib를 복사하여 링크를 한다
다음의 헤더파일을 포함한다
extern "C"{
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
}
필요한 라이브러리만 링크하면 되지만 다음의 파일을 링크한다
lib 파일
avcodec.lib
avdevice.lib
avformat.lib
avutil.lib
postproc.lib
swresample.lib
swscale.lib
FFMpeg 을 이용하여 프로그래밍 하기 위해서는 동영상 파일의 이해가 필요
출처 : http://aslike.egloos.com/3082696
미디어 파일 : 플레이어에서 재생하기 위한 비디오/오디오 데이터를 가지고 있는 파일
- 다음과 같은 과정으로 미디어 파일이 만들어짐
- 2가지 과정이 필요
Encoding : 원본 영상/소리를 압축
Enconding을 하는 이유 : 원본 영상의 데이터 크기가 크기 때문
Encoder : Encoding을 해주는 객체
Muxing : 영상/소리 등 모든 파일을 하나로 합치는 작업
- 하나의 파일로 만들기 위해 영상, 소리, 자막등 여러 요소들을 하나로 합침
- Container 포맷 : 모든 요소(영상, 음성, 자막등)들을 담는 하나의 포맷(상자)
플레이어가 하는 일 : 하나로 합쳐져 있는 파일을 분리, 디코딩(압축 풀기)해서 출력
- 2가지 과정이 필요
Demuxing : 컨테이너 포맷(파일)을 열고 내용 확인
몇 종류의 요소가 들었나 확인(영상, 음성, 자막, 다채널 등)
각 요소마다 하나씩 꺼내서 디코딩 준비
Decoding : 압축을 풀어서 원본 영상/소리로 변환
- Decoding 후원본 영상/소리를 가지고 후처리 작업 진행 가능
- 영상과 소리를 시간에 맞게 동기화 해서 출력
FFMpeg의 역할
출력 이외의 위의 모든 역할을 함
SDL (Simple Direct Media Layout)을 사용하는데
다음과 같은 에러가 발생한다
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol
_main referenced in function ___tmainCRTStartup
1>D:\bin\Debug\Tutorial.exe : fatal error LNK1120: 1 unresolved externals
이것은 main( ) 함수를 호출할 때 SDL에서 정의 해놓은 SDL_main( )과 겹치기 때문
#define main SDL_main( )
따라서 이것을 막으려면
#undef main
을 해주면 된다
이런 글은 언제 쯤 우리나라에서 검색될 수 있으려나
- 출처
http://aslike.egloos.com/3082696
- 컨테이너(Container) : 파일 그 자체 / ex) 유형(Type) : avi, Quicktime
- 스트림(Stream) : 데이터 원소(element)의 연속
- 프레임(Frame) : 데이터 원소 하나
- 패킷(Packet) : 응용프로그램에서 사용 가능할만큼의 raw 프레임으로 디코딩 가능한 데이터의 비트를 포함하는 데이터의 조각
- 먹싱(Muxing) : 오디오와 비디오를 하나의 파일로 합침
- 디먹싱(Demuxing) : 하나의 파일을 오디오와 비디오로 분리
- 스트리밍 기초 흐름도
- 동영상 파일로부터 비디오 스트림을 연다
- 비디오 스트림으로부터 패킷을 연다
- 패킷을 디코딩하여 프레임을 얻는다
- 만약 프레임이 완전하지 않으면 다음 프레임을 얻는다
- 프레임을 가지고 무엇을 한다
- 다음 패킷을 읽어들인다
입력 스트림을 열고 헤더를 읽는다.
avformat_close_input( )를 사용하여 꼭 닫아야 한다
- 파라미터
- ps : avformat_alloc_context( )으로 할당한 AVFormatContext의 포인터
- filename : 열기를 할 스트림의 파일 이름
- fmt : 구체적인 입력 포멧
- options : AVFormatContext로 채워진 dictionary와 demuxer-private 옵션
2.
int | avformat_find_stream_info (AVFormatContext *ic, |
avformat_open_input( ) 보다 더 많은 정보를 얻는다파일을 조금 더 읽어서 구체적인 정보를 AVFormatContext에 저장한다.
3.
void | av_dump_format (AVFormatContext *ic, int index, const char *url, int is_output) |
AVCodec * | avcodec_find_decoder (enum AVCodecID id) |
codecContext를 복사한다
int | avcodec_open2 (AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options) |