//------------------------------------------------------------------------------
// 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 |