2013-04-16 1 views
0

VLC, WMP 및 WMPClassic으로 테스트 한 빈 화면 만 보여주는 출력 비디오로 몇 주 동안 프로그램을 디버깅했습니다. 나는 FFPlay와 lo를 사용해 보았고 비디오가 완벽하게 작동하는 것을 보았다. 이 잘못된 픽셀 형식으로 인해 일반적으로 및 PIX_FMT_YUV420P 전환하는 보편적으로 작동하게됩니다 읽었습니다 ...하지만 이미 인코딩 프로세스에서 해당 픽셀 형식을 사용하고 있습니다. 이것을 일으키는 다른 것이 있습니까?FFMpeg로 인코딩 된 비디오는 FFPlay에서만 재생됩니다.

AVCodec* codec; 
AVCodecContext* c = NULL; 
uint8_t* outbuf; 
int i, out_size, outbuf_size; 

avcodec_register_all(); 

printf("Video encoding\n"); 

// Find the mpeg1 video encoder 
codec = avcodec_find_encoder(CODEC_ID_H264); 
if (!codec) { 
    fprintf(stderr, "Codec not found\n"); 
    exit(1); 
} 
else printf("H264 codec found\n"); 

c = avcodec_alloc_context3(codec); 

c->bit_rate = 400000; 
c->width = 1920;          // resolution must be a multiple of two (1280x720),(1900x1080),(720x480) 
c->height = 1200; 
c->time_base.num = 1;         // framerate numerator 
c->time_base.den = 25;         // framerate denominator 
c->gop_size = 10;          // emit one intra frame every ten frames 
c->max_b_frames = 1;         // maximum number of b-frames between non b-frames 
//c->keyint_min = 1;          // minimum GOP size 
//c->i_quant_factor = (float)0.71;      // qscale factor between P and I frames 
//c->b_frame_strategy = 20; 
//c->qcompress = (float)0.6; 
//c->qmin = 20;           // minimum quantizer 
//c->qmax = 51;           // maximum quantizer 
//c->max_qdiff = 4;          // maximum quantizer difference between frames 
//c->refs = 4;           // number of reference frames 
//c->trellis = 1;           // trellis RD Quantization 
c->pix_fmt = PIX_FMT_YUV420P; 
c->codec_id = CODEC_ID_H264; 
//c->codec_type = AVMEDIA_TYPE_VIDEO; 

// Open the encoder 
if (avcodec_open2(c, codec,NULL) < 0) { 
    fprintf(stderr, "Could not open codec\n"); 
    exit(1); 
} 
else printf("H264 codec opened\n"); 

outbuf_size = 100000 + c->width*c->height*(32>>3);//*(32>>3);   // alloc image and output buffer 
outbuf = static_cast<uint8_t *>(malloc(outbuf_size)); 
printf("Setting buffer size to: %d\n",outbuf_size); 

FILE* f = fopen("example.mpg","wb"); 
if(!f) printf("x - Cannot open video file for writing\n"); 
else printf("Opened video file for writing\n"); 

// encode 5 seconds of video 
for(i=0;i<STREAM_FRAME_RATE*STREAM_DURATION;i++) { 
    fflush(stdout); 

    screenCap(); 

    int nbytes = avpicture_get_size(PIX_FMT_YUV420P, c->width, c->height); 
    uint8_t* outbuffer = (uint8_t*)av_malloc(nbytes*sizeof(uint8_t)); 

    AVFrame* inpic = avcodec_alloc_frame(); 
    AVFrame* outpic = avcodec_alloc_frame(); 

    outpic->pts = (int64_t)((float)i * (1000.0/((float)(c->time_base.den))) * 90); 
    avpicture_fill((AVPicture*)inpic, (uint8_t*)pPixels, PIX_FMT_RGB32, c->width, c->height);     // Fill picture with image 
    avpicture_fill((AVPicture*)outpic, outbuffer, PIX_FMT_YUV420P, c->width, c->height); 
    av_image_alloc(outpic->data, outpic->linesize, c->width, c->height, c->pix_fmt, 1); 

    inpic->data[0] += inpic->linesize[0]*(screenHeight-1);              // Flipping frame 
    inpic->linesize[0] = -inpic->linesize[0];                 // Flipping frame 

    struct SwsContext* fooContext = sws_getContext(screenWidth, screenHeight, PIX_FMT_RGB32, c->width, c->height, PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL); 
    sws_scale(fooContext, inpic->data, inpic->linesize, 0, c->height, outpic->data, outpic->linesize); 

    // encode the image 
    out_size = avcodec_encode_video(c, outbuf, outbuf_size, outpic); 
    printf("Encoding frame %3d (size=%5d)\n", i, out_size); 
    fwrite(outbuf, 1, out_size, f); 
    delete [] pPixels; 
    av_free(outbuffer);  
    av_free(inpic); 
    av_free(outpic); 
} 

// get the delayed frames 
for(; out_size; i++) { 
    fflush(stdout); 

    out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL); 
    printf("Writing frame %3d (size=%5d)\n", i, out_size); 
    fwrite(outbuf, 1, out_size, f); 
} 

// add sequence end code to have a real mpeg file 
outbuf[0] = 0x00; 
outbuf[1] = 0x00; 
outbuf[2] = 0x01; 
outbuf[3] = 0xb7; 
fwrite(outbuf, 1, 4, f); 
fclose(f); 

avcodec_close(c); 
free(outbuf); 
av_free(c); 
printf("Closed codec and Freed\n"); 

답변

1

대신 example.mpg의, example.h264로 파일을 저장하십시오.