2013-11-25 77 views
0

我想使用libavcodec編碼一個flv視頻。 以下代碼是生成mpeg視頻的示例代碼,效果很好。但在用AV_CODEC_ID_FLV1替換編解碼器ID後,生成的視頻文件無法播放。編碼由libavcodec flv視頻不工作

void simpleEncode(){ 
    AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_MPEG1VIDEO); 
    AVCodecContext *ctx = avcodec_alloc_context3(codec); 
    ctx->bit_rate = 400000; 
    ctx->width = 352; 
    ctx->height = 288; 
    AVRational time_base = {1,25}; 
    ctx->time_base = time_base; 
    ctx->gop_size = 10; 
    ctx->pix_fmt = AV_PIX_FMT_YUV420P; 

    avcodec_open2(ctx, codec, NULL); 

    AVFrame *frame = av_frame_alloc(); 
    av_image_alloc(frame->data, frame->linesize, ctx->width, ctx->height, ctx->pix_fmt, 32); 
    frame->format = ctx->pix_fmt; 
    frame->height = ctx->height; 
    frame->width = ctx->width; 

    AVPacket pkt; 
    int got_output; 
    FILE *f = fopen("test.mpg", "wb"); 
    for(int i=0; i<25; i++){ 
     av_init_packet(&pkt); 
     pkt.data = NULL; 
     pkt.size = 0; 

     for(int w=0; w<ctx->width; w++){ 
      for(int h=0; h<ctx->height; h++){ 
       frame->data[0][h*frame->linesize[0]+w]=i*10; 
      } 
     } 
     for(int w=0; w<ctx->width/2; w++){ 
      for(int h=0; h<ctx->height/2; h++){ 
       frame->data[1][h*frame->linesize[1]+w]=i*10; 
       frame->data[2][h*frame->linesize[2]+w]=i*10; 
      } 
     } 

     frame->pts=i; 
     avcodec_encode_video2(ctx, &pkt, frame, &got_output); 

     fwrite(pkt.data, 1, pkt.size, f); 
    } 
} 

回答

0

AV_CODEC_ID_FLV1是一個名字很差的宏。它是指Sorenson H.263編解碼器。它曾經是FLV容器格式的默認編解碼器,但不再是。它被VP6和現在的h.264取代。除了這個歷史記錄,它與flv容器格式沒有任何關係。

mpeg1流是一件奇怪的事情,因爲它的基本流格式也是一個有效的容器。 h.263並非如此。您不能簡單地將數據包寫入磁盤並回放。您必須將ES封裝到容器中。最簡單的方法是使用libavformat。