ffmpeg 천줄로 비디오플레이어 만들기

http://www.dranger.com/ffmpeg/ffmpeg.html

http://hybridego.net/entry/천줄로-비디오플레이어-만들기
http://hybridego.net/entry/千-Line-으로-비디오플레이어-만들기-1
http://hybridego.net/entry/千-Line-으로-비디오플레이어-만들기-2
http://hybridego.net/entry/千-Line-으로-비디오플레이어-만들기-3
http://hybridego.net/entry/千-Line-으로-비디오플레이어-만들기-4
http://hybridego.net/entry/千-Line-으로-비디오플레이어-만들기-5
http://hybridego.net/entry/千-Line으로-비디오플레이어-만들기-6
http://hybridego.net/entry/千-Line으로-비디오플레이어-만들기-7
http://hybridego.net/entry/千-Line으로-비디오플레이어-만들기-8
http://hybridego.net/entry/千-Line으로-비디오플레이어-만들기-마무리
별로 중요하지 않은 부분중 생략된 부분이 있고 의역이 많이 있습니다.
군데군데 틀린 번역이 있을수 있습니다. (영어가 후달려서)

하지만 소스코드 설명 부분은 틀리지 않도록 노력했습니다.

위의 원문을 번역한 것입니다.
잘못된 부분이 있을지도 모르겠습니다.
혹시 잘못된 부분을 발견하시면 댓글로 알려주시면 감사하겠습니다.



Tutorial 08: Software Scaling


libswscale

ffmpeg는 최근 새 인터페이스를 추가했습니다. libswscale 이라는 이미지 스케일을 제어하는 것을요. 사실 전에 우리가 img_convert 를 이용해서 RGB를 YUV로 바꾸었던것입니다. 이제 우리는 새 인터페이스로 그것을 대신 하겠습니다. 이 새로운 인터페이스는 더 모듈화되고, 더 빠르고, MMX 최적화를 해서 더 믿을만 합니다. 한마디로 스케일링하는데 적합하다는 것이죠.

우리는 그동안 기본함수인
sws_scale 을 사용할것입니다. 하지만 우선 우리는 SwsContext라고 부르는 것을 설정해야 합니다. 이것은 우리가 원하는대로 바꾼것을 컴파일 하게 해주고 그것을 다음에 sws_scale에 넘겨줍니다. 이것은 SQL이나 파이선의 compiled regexp에서 몇몇의 준비된 문장입니다. 이 context를 준비하려면 sws_getContext 함수를 사용합니다. 이 함수는 소스의 가로 세로 값과 우리가 원하는 가로 세로 값 그리고 소스의 포맷과 원하는 포냇을 입력해야 합니다. 그리고 몇가지 다른 옵션들과 플래그도 넣어줘야 합니다. 그러면 SwsContext에 그것을 건네주지 않고 sws_scale을 img_convert 와 비슷한 방법으로 사용합니다.

AVFrame, img_convert, SDL_LockYUVOverlay(), img_convert, sws_getContext(), sws_scale()
이제 우리가 새롭게 scaling 한 것이 나옵니다.
여러분은 이것을 이용해서 libswscale이 할수 있는 여러가지 아이디어를 얻으실 수 있을것입니다.

컴파일 해볼까요?
gcc -o tutorial08 tutorial08.c -lavutil -lavformat -lavcodec -lz -lm `sdl-config --cflags --libs`

드디어 여러분은 1,000 줄 만에 근사한 무비 플레이어를 만들게 되셨습니다.

축하합니다. ㅋ
Posted by Real_G

댓글을 달아 주세요

  1. 돌도리 2014.05.31 00:42  수정/삭제 댓글쓰기 댓글주소

    리눅스프로그램을 배운지 얼마안된 왕초보학생입니다. 문제가 생겨서 이렇게 여쭤봅니다.

    ffmpeg설치와 기타 헤더파일 인식을 인식못하는 gcc 에러 등을 해결한후 이러한 문제에 직면했습니다

    어찌해야될지 막막해서 이렇게 글을 올려봅니다 반드시 이프로그램을 실행시켜봐야하는데 어찌하면 좋을까요?
    환경은 우분투 14.04 in 버추얼박스입니다 제발 알려주세요ㅜㅜ



    embed@embed-VirtualBox:~/video$ gcc -o tutorial08 tutorial08.c -lavutil -lavformat -lavcodec -lz -lm `sdl-config --cflags --libs`
    In file included from /usr/include/libavutil/common.h:412:0,
    from /usr/include/libavutil/avutil.h:283,
    from /usr/include/libavutil/samplefmt.h:24,
    from /usr/include/libavcodec/avcodec.h:31,
    from tutorial08.c:18:
    tutorial08.c:69:43: error: ‘AVCODEC_MAX_AUDIO_FRAME_SIZE’ undeclared here (not in a function)
    DECLARE_ALIGNED(16, uint8_t, audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2]);
    ^
    tutorial08.c: In function ‘queue_picture’:
    tutorial08.c:581:8: warning: passing argument 2 of ‘sws_scale’ from incompatible pointer type [enabled by default]
    0, is->video_st->codec->height, pict.data, pict.linesize);
    ^
    In file included from tutorial08.c:20:0:
    /usr/include/libswscale/swscale.h:224:5: note: expected ‘const uint8_t * const*’ but argument is of type ‘uint8_t **’
    int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
    ^
    tutorial08.c: In function ‘our_get_buffer’:
    tutorial08.c:623:3: warning: ‘avcodec_default_get_buffer’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:3744) [-Wdeprecated-declarations]
    int ret = avcodec_default_get_buffer(c, pic);
    ^
    tutorial08.c: In function ‘our_release_buffer’:
    tutorial08.c:631:3: warning: ‘avcodec_default_release_buffer’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:3745) [-Wdeprecated-declarations]
    avcodec_default_release_buffer(c, pic);
    ^
    tutorial08.c: In function ‘video_thread’:
    tutorial08.c:641:3: warning: ‘avcodec_alloc_frame’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:3422) [-Wdeprecated-declarations]
    pFrame = avcodec_alloc_frame();
    ^
    tutorial08.c: In function ‘stream_component_open’:
    tutorial08.c:697:30: error: ‘CODEC_TYPE_AUDIO’ undeclared (first use in this function)
    if(codecCtx->codec_type == CODEC_TYPE_AUDIO) {
    ^
    tutorial08.c:697:30: note: each undeclared identifier is reported only once for each function it appears in
    tutorial08.c:736:8: error: ‘CODEC_TYPE_VIDEO’ undeclared (first use in this function)
    case CODEC_TYPE_VIDEO:
    ^
    tutorial08.c:746:5: warning: ‘get_buffer’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:2079) [-Wdeprecated-declarations]
    codecCtx->get_buffer = our_get_buffer;
    ^
    tutorial08.c:747:5: warning: ‘release_buffer’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:2093) [-Wdeprecated-declarations]
    codecCtx->release_buffer = our_release_buffer;
    ^
    tutorial08.c: In function ‘decode_thread’:
    tutorial08.c:785:3: warning: ‘av_find_stream_info’ is deprecated (declared at /usr/include/libavformat/avformat.h:1833) [-Wdeprecated-declarations]
    if(av_find_stream_info(pFormatCtx)<0)
    ^
    tutorial08.c:794:51: error: ‘CODEC_TYPE_VIDEO’ undeclared (first use in this function)
    if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO &&
    ^
    tutorial08.c:798:51: error: ‘CODEC_TYPE_AUDIO’ undeclared (first use in this function)
    if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_AUDIO &&
    ^
    embed@embed-VirtualBox:~/video$

    • 제가 이 문서를 번역했을 당시의 ffmpeg 버전과 현재 버전이 달라서 나오는 에러 입니다.
      새버전 ffmpeg에 맞게 수정하셔야 합니다.(아니면 옛날버전 ffmpeg 을 구해서 해도 되긴 합니다.)
      올려준 에러 메세지에 보면 error 로 나오는 부분의 define되어있는 것들을 새버전의 ffmpeg에 맞게 바꿔주세요.

  2. 돌도리 2014.06.01 03:32  수정/삭제 댓글쓰기 댓글주소

    새버젼의 define 되어있는것들을 어디서 어떻게 알아야하나요?
    혹은 옛버젼의 ffmpeg 버젼은 어떤것인지?