안녕하세요. ffmpeg ndk를 이용하여 스트리밍을 해보있는 학생입니다.
ffmpeg 관련일것같아서 이쪽게시판에 글을 남김니다.
다음과같은 에러가 해결이 되지 않아 글을 남깁니다..
06-11 08:25:30.925: A/libc(30095): Fatal signal 11 (SIGSEGV) at 0x5acec000 (code=1), thread 30200 (m.example.test2)
입니다. 서버에서 클라이언트쪽으로 h264디코딩된 결과를 보내주게되는데 처음에 sps(19byte) pps(9byte) 처리를 하지 못하는 탓인지 자꾸 에러가 발생합니다.
하여 avcodec_decode_video2 를 주석처리 한 결과 이상없이 데이터를 주고 받는 것을 보아 서버 클라이언트 문제는 아닌것 같았습니다. (하지만 이상하게도 간혹 될때도있습니다. 한 번 에러를 일으키고 난 뒤)
int ffmpegInit()
{
__android_log_print(ANDROID_LOG_DEBUG, "ffmpegInit", "Start");
avcodec_init();
av_register_all();
pCodec = avcodec_find_decoder(CODEC_ID_H264);
pCodecCtx = avcodec_alloc_context3(pCodec);
pCodecCtx->width = IMAGE_WIDTH;
pCodecCtx->height = IMAGE_HEIGHT;
pCodecCtx->codec_id = CODEC_ID_H264;
pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
pCodecCtx->flags2 |= CODEC_FLAG2_FAST;
pCodecCtx->thread_count = 0;
pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
if(avcodec_open2(pCodecCtx, pCodec, 0) < 0)
return -1;
pVFrame = avcodec_alloc_frame(); // 디코딩 된 데이터를 담는 프레임 버퍼 할당
pFrameRGB = avcodec_alloc_frame();
img_size = avpicture_get_size(PIX_FMT_RGB24,IMAGE_WIDTH, IMAGE_HEIGHT);
buffer = (unsigned char *) malloc(sizeof(unsigned char) * img_size);
avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height);
img_convert_ctx = sws_getCachedContext(img_convert_ctx,
pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt,
pCodecCtx->width, pCodecCtx->height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);
return 1;
}
int ffmpegDecoding(unsigned char *sock_buffer, int ImageLength, int count, unsigned char *outputRGB)
{
AVPacket packet;
av_init_packet(&packet);
//__android_log_print(ANDROID_LOG_DEBUG, "ffmpegDecoding", "Start");
int bGotPicture = 0;
packet.data = sock_buffer;
packet.size = ImageLength;
int len;
__android_log_print(ANDROID_LOG_DEBUG, "FFmpegDecoing","Start");
if( ( len = avcodec_decode_video2( pCodecCtx, pVFrame, &bGotPicture, &packet )) < 0)
return -1;
__android_log_print(ANDROID_LOG_DEBUG, "FFmpegDecoing","Len : %d",len);
__android_log_print(ANDROID_LOG_DEBUG, "FFmpegDecoing","bGotPicture : %d",bGotPicture);
__android_log_print(ANDROID_LOG_DEBUG, "FFmpegDecoing","End");
/*
if(bGotPicture)
{
__android_log_print(ANDROID_LOG_DEBUG, "ColorConvert", "Start");
sws_scale(img_convert_ctx, pVFrame->data, pVFrame->linesize, 0,pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
memcpy(outputRGB, pFrameRGB->data[0], img_size);
__android_log_print(ANDROID_LOG_DEBUG, "ColorConvert", "End");
}
*/
av_free_packet(&packet);
return 1;
}
위 코드가 ffmpeg init 부분이고 decoding 하드 부분인데 어떻게 에러를 해결해야 할지 보통 감이 잡히질 않습니다.
혹시 도움될만한 것이 있다면 꼭 답변 부탁드립니다!.