0
H264로 인코딩 된 비디오를 디코딩하려고합니다. AVPacket의 데이터와 크기를 디코더 코드로 보냅니다. 거기 프레임을 해독하고 GUI에 표시하려고합니다. 문제는 내가 프레임을 디코딩 할 때 패킷의 크기와 동일한 수의 프레임 바이트를 반환한다는 것입니다. 즉, 데이터의 압축을 풀지 못한다는 의미입니다. 어느 것이 문제가 될 것인지 알려줄 수 있습니까? 내 인코딩 프로그램이 정상적으로 작동하고 있습니다. 여기libavcodec 비디오 디코딩이 작동하지 않습니다.
... 나는 다른 방법으로 AVCodecContext 및 코덱과 같은 다른 모든 코드를 초기화하고
int len ,got_frame;
avpkt.size = data_length;
avpkt.data = frame_buffer;
if(!frame_buffer){
return "frame buffer empty\n";
}
len = avcodec_decode_video2(avctx ,frame ,&got_frame ,&avpkt);
if(len < 0){
return "error while decoding\n";
}
if(got_frame){
static struct SwsContext *img_convert_ctx;
if(img_convert_ctx == NULL) {
img_convert_ctx = sws_getContext(w, h,
PIX_FMT_YUV420P, avctx->width,
avctx->height, PIX_FMT_BGR24,
SWS_BICUBIC, NULL, NULL, NULL);
if(img_convert_ctx == NULL) {
return "Cannot initialize the conversion context!\n";
}
}
j=sws_scale(img_convert_ctx,
frame->data , frame->linesize ,
0, h ,picture->data,
picture->linesize);
if(j==0){
exit(1);
}
인코딩
static struct SwsContext *img_convert_ctx;
pkt.data = NULL;
pkt.size = 0;
avpicture_fill((AVPicture *)srcFrame, frame,AV_PIX_FMT_BGR24, 640, 480);
if(img_convert_ctx == NULL) {
int w = 640;
int h = 480;
img_convert_ctx = sws_getContext(w, h,
AV_PIX_FMT_BGR24, c->width, c->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
if(img_convert_ctx == NULL) {
fprintf(stderr, "Cannot initialize the conversion context!\n");
}
}
sws_scale(img_convert_ctx, srcFrame->data, srcFrame->linesize, 0,480,picture->data, picture->linesize);
fflush(stdout);
picture->pts=counter;
ret = avcodec_encode_video2(c, &pkt, picture, &got_output);
if (ret < 0) {
fprintf(stderr, "Error encoding frame\n");
}
if (got_output) {
vdec.decode_frame(pkt.data ,pkt.size);
av_free_packet(&pkt);
}
디코더 코드에 대한 코드입니다.
해결 방법을 찾도록 도와주십시오.
그렇습니다. 왜냐하면 got_frame은 항상 1을 반환하기 때문에 프레임을 디코딩하고 있지만, 창에 페인트하려고 할 때 항상 왜곡 된 프레임을 보여줍니다. – Imrank
어떤 종류의 왜곡을보고 있습니까? 가능하다면 예를 든다. – pogorskiy
ffmpeg 포럼 링크에서 동일한 질문을했습니다. http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=7&t=949 이미지를 참조하십시오. – Imrank