마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ffmpeg 관련 조언해주실 분 계신가요?

0 추천

ffmpeg을 사용하여 동영상을 돌리고 있습니다.

디코딩하여 비트맵을 가져올 때, 어떤 동영상은 너무 속도가 빠르고, 어떤 동영상은 너무 느립니다.

ffmpeg으로 동영상을 재생할 때 1초 정도가 실제 시간 1.5초, 2초까지 느려지는 경우가 생깁니다.

h.264를 디코딩할 때 그런다던지 등등..

디코딩을 하는 함수인데, 어느 부분을 건드려주어야 재생 속도를 맞출 수 있을까요?

초당 프레임 수가 다른 것도 원인이 될 듯한데..

조언 부탁드립니다..

 

 

int decodeFrame()
{
int frameFinished = 0;
AVPacket packet;
 
while (av_read_frame(gFormatCtx, &packet) >= 0) {
testtime = gFrame->display_picture_number;
if (packet.stream_index == gVideoStreamIdx) {
avcodec_decode_video2(gVideoCodecCtx, gFrame, &frameFinished, &packet);
if (frameFinished) {
gImgConvertCtx = sws_getCachedContext(gImgConvertCtx,
gVideoCodecCtx->width, gVideoCodecCtx->height, gVideoCodecCtx->pix_fmt,
gVideoCodecCtx->width, gVideoCodecCtx->height, PIX_FMT_RGB565LE, SWS_BICUBIC, NULL, NULL, NULL);
 
sws_scale(gImgConvertCtx, gFrame->data, gFrame->linesize, 0, gVideoCodecCtx->height, gFrameRGB->data, gFrameRGB->linesize);
av_free_packet(&packet);
 
return 0;
}
}
av_free_packet(&packet);
}
 
return -1;
}
익명사용자 님이 2013년 5월 10일 질문

2개의 답변

0 추천

해상도 문제입니다. 1080p 영상의 경우 해상도가 1920*1080 이며 YUV420 영상의 경우  2바이트가 한 픽셀의 정보를 가지고 있기 때문에.   한장을 표시하는데 약 4메가 정도의 데이터가 필요합니다.  

이걸 30fps에 처리한다면, 33ms 내에 CPU에서 처리를 해야하는데,  휴대폰 CPU가 미쳐 처리를 못해서 늦어지는 것입니다. 

디코딩은 FFMPEG에서 하는 것이라 속도를 올리려면 FFMPEG를 수정해야 하는데 전문가가 아닌 이상 수정이 거의 불가능하고, sws_scale 부분이 디코딩되어 나온 YUV420p 영상을 RGB565로 변경하는 부분인데, 주로 이부분을 수정하여 속도 향상을 꾀합니다.

이 부분을  구글링하여 나온 ARM Neon의 칼라컨버터  코드를 사용하던지, HW 렌더러인 OpenGL을 이용하면, 약간의 속도 향상을  시킬 수 있습니다. 

하지만 아직은 100%는 불가능하며, 몇년이 지나 폰성능이 좀 올라가면 가능할 듯 합니다. 

사악미소 (65,330 포인트) 님이 2013년 5월 10일 답변
사악미소님이 2013년 5월 10일 수정
오.. 고급정보 감사합니다!! 해보겠습니다 ㅎㅎ
0 추천
ffmpeg 디코딩은 기본적으로 SW 기반이므로 1080 같이 고해상도 영상은 단말 성능에 따라 1배속 처리가 힘들수 있습니다.

이때는 source parsing+demuxing 만 ffmpeg 으로 하고 나머지는 HW 기반으로 진행해야 1배속 이상 처리가 가능합니다.

 
ffmpeg + OMXCoddec + ANativeWindow or OpenGL

libstagefright 부분을 참고하시면 도움이 될 것 입니다.

이상입니다.
유그노 (140 포인트) 님이 2014년 7월 28일 답변
...