2013-08-26 2 views
0

비디오를 디코딩하고 프레임을 rgb32 또는 gb565le 형식으로 변환하려고합니다.ffmepg에 의해 디코딩 된 프레임은 어디에 저장됩니까?

그런 다음이 프레임을 JNI가 C에서 Android 버퍼로 전달합니다.

지금까지 저는 C에서 Android로 버퍼를 전달하는 방법과 비디오를 디코딩하고 디코딩 된 프레임을 얻는 방법을 알고 있습니다.

제 질문은 디코딩 된 프레임을 rgb32 (또는 rgb565le)로 변환하는 방법이며 저장 위치는 어디입니까?

다음은 제 코드입니다. 정확하지는 않은지 잘 모르겠습니다.

-Jargo


img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, 100, 100, PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL); 
if(!img_convert_ctx) return -6; 

while(av_read_frame(pFormatCtx, &packet) >= 0) { 
    // Is this a packet from the video stream? 
    if(packet.stream_index == videoStream) { 
     avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet); 

     // Did we get a video frame? 
     if(frameFinished) { 
      AVPicture pict; 

      if(avpicture_alloc(&pict, PIX_FMT_RGB32, 100, 100) >= 0) { 
       sws_scale(img_convert_ctx, (const uint8_t * const *)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pict.data, pict.linesize); 
      } 
     } // End of if(frameFinished) 
    } // End of if(packet.stream_index == videoStream) 

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

답변

0

디코딩 프레임 pict로 진행한다. (pFrame은 원시 프레임입니다.)

100x100은 아마도 p32 크기의 크기를 기준으로 pict 크기를 계산해야합니다. 내가해야 할 것 같아 pFrame->width*pFrame->height*32;

너 자신 pict을 할당해야한다. `변환 된 프레임 데이터가`pict.data`에 저장됩니다 sws_scale` 후

,이 튜토리얼 http://dranger.com/ffmpeg/

+0

당신은 의미가 보이십니까? 'pict '를 어떻게 할당할까요? 이처럼'avpicture_fill (& pict, buffer, PIX_FMT_RGB32, 100, 100); – Jar

+0

예, 그것이 제가 의미했던 것입니다. 이 자습서에는 예제가 있습니다. –

관련 문제