2013-04-16 2 views
0

Я отлаживал свою программу в течение пары недель, когда выходное видео показывало только пустой экран (тестировался с помощью VLC, WMP и WMPClassic). Я попытался использовать FFPlay, и вот, видео работает отлично. Я читал, что это обычно вызвано неправильным пиксельным форматом, и что переход на 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.h264, вместо example.mpg.

Смежные вопросы