//------------------------------------------------------------------------------
// Using libavformat and libavcodec: An Update
//------------------------------------------------------------------------------
// 주석 : 이것도 2004년에 작성된거다.
// 
// 몇달전 libavformat 과 libavcodec 을 사용하는 글을 하나 작성했다.
// 그후, 새로운 ffmpeg 버젼이 나왔다. 어쩌구 저쩌구...
// 기존버젼과의 차이점을 설명한다. 앞에 글을 먼저 읽어라.
// 
// 뭐가 새롭나?
// 프로그래머의 입장에서, 큰 변화는 동영상파일에서 각각의 video frame들을 읽기가 심플해졌다.
// ffmpeg0.4.8 이전버젼에서는,
// 동영상파일로부터 av_read_packet() 루틴을 사용해서 데이타를 패킷단위로 읽었다.
// 일반적으로, video frame을 위한 정보는 여러 패킷에 퍼져 있다.
// 그래서, 두개의 video frame 사이의 경계가 패킷 중간에 올수도 있어서 복잡했다.
// 고맙게도 ffmpeg0.4.9 는 av_read_frame() 이라는 새로운 루틴을 제공한다.
// 하나의 패킷에 video frame 을 위한 모든 데이타를 담아서 리턴해준다.
// 옛날 방식인 av_read_pakcet() 루틴은 아직도 지원하지만, deprecated 됐다.
// good riddance : (~이 없어져서·~을 안 보게 되어) 속이 시원하다 ㅋㅋㅋ
// 
// 그래서, 새로운 api 를 이용해서, 어떻게 video data에 접근하지는 보자.
// 옛날글에서 main decode loop 는 다음과 같이 생겼었다.
// while(GetNextFrame(pFormatCtx, pCodecCtx, videoStream, pFrame))
// {
//  ...
// }
// 새로운 API는 우리가 main loop 에서, 데이타를 실제로 읽고, 디코딩할수 있게, 간단하게 해준다.
//------------------------------------------------------------------------------
while(av_read_frame(pFormatCtx, &packet)>=0)
{
    // Is this a packet from the video stream?
    if(packet.stream_index==videoStream)
    {
        // Decode video frame
        avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, 
            packet.data, packet.size);

        // Did we get a video frame?
        if(frameFinished)
        {
            // Convert the image from its native format to RGB
            img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, 
                (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, 
                pCodecCtx->height);

            // Process the video frame (save to disk etc.)
            DoSomethingWithTheImage(pFrameRGB);
        }
    }

    // Free the packet that was allocated by av_read_frame
    av_free_packet(&packet);
}

// 이제 지난번에 만들었던 GetNextFrame 함수는 필요없다.
// 0.4.9버젼에서 중요한 또 한가지는, 비디오파일의 timestamp 탐색이 가능해졌다.
// av_seek_frame() 함수는 세개의 파라메터를 받는다.
// AVFormatContext*, stream index, timestamp
// 그러면 그 함수는 처음 key frame 을 찾는다.


반응형

'잡다한 자료' 카테고리의 다른 글

[Thrift] 맥에 Thrift 설치 방법  (0) 2015.02.04
ffmpeg. ffmpeg visual studio 2010  (0) 2014.07.04
ffmpeg. Using libavformat and libavcodec 번역  (0) 2014.07.04
jquery clone  (0) 2014.07.04
MySQL 함수 생성후, 실행권한 부여  (0) 2014.07.04
Posted by 돌비
,