我正在尝试使用libavcodec来编码flv视频。 以下代码是生成mpeg视频的示例代码,它运行良好。但在用AV_CODEC_ID_FLV1替换编解码器ID后,无法播放生成的视频文件。
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 :(得分:0)
AV_CODEC_ID_FLV1是一个命名不佳的宏。它指的是Sorenson H.263编解码器。它曾经是FLV容器格式的默认编解码器,但不再是。它被VP6取代,现在为h.264。除了这段历史,它与flv容器格式无关。
mpeg1流是一件奇怪的事情,因为它的基本流格式也是一个有效的容器。 h.263不是这种情况。您不能简单地将数据包写入磁盘并播放它们。您必须将ES封装到容器中。最简单的方法是使用libavformat。