0

我正在尝试使用 libavcodec 对 flv 视频进行编码。以下代码是生成 mpeg 视频的示例代码,效果很好。但是将编解码器ID替换为AV_CODEC_ID_FLV1后,生成的视频文件无法播放。

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);
    }
}
4

1 回答 1

0

AV_CODEC_ID_FLV1 是一个名称不佳的宏。它指的是 Sorenson H.263 编解码器。它曾经是 FLV 容器格式的默认编解码器,但现在不再是。它被 VP6 和现在的 h.264 取代。除了这个历史,它与 flv 容器格式无关。

一个 mpeg1 流是一个奇怪的东西,因为它的基本流格式也是一个有效的容器。这不是 h.263 的情况。您不能简单地将数据包写入磁盘并进行回放。您必须将 ES 封装到容器中。最简单的方法是使用 libavformat。

于 2013-11-27T19:28:45.577 回答