Sam, Early on in my video encoding work I had encountered something similar. I don't know if this can help you or not -- while I'm capturing from QTKit, I am converting pixel formats and encoding to FLV. There's enough similarity there that I thought it might be worth taking a look-see at my code example. If it helps, great, if not, sorry about that, and I wish you the best of luck in figuring it out. Here's the code:
https://github.com/BigHillSoftware/QTFFmpeg Hopefully there's something in the source that will help. Cheers, Brad On May 5, 2013, at 4:59 AM, yy-zed <[email protected]> wrote: > I've written a piece of C++ code that can capture webcam video frame, decode > them, convert them to YUV420P, encode them and then write them to a file. If > I use the mpeg2 codec and write to a .mpg file, everything works perfectly. > But, if I use flv, then the output produced is just a green screen. I'm not > sure if there are different encoder settings I need to set for encoding flv > video?Or maybe I'm doing something wrong in sws_scale? Here's my code(the > relevant parts): > > Encoder settings: > > c->codec_id = codec_id; > c->bit_rate = 400000; > // Resolution must be a multiple of two. > c->width = 352; > c->height = 288; > c->time_base.den = STREAM_FRAME_RATE; > c->time_base.num = 1; > //emit one intra frame every twelve frames at most > c->gop_size = 12; > c->pix_fmt = STREAM_PIX_FMT; > > Encoding a frame: > > int ret; > uint8_t *buffer = NULL; > static struct SwsContext *sws_ctx; > > //Setup the codec context, and set its width and height to be equal to the > input video width and height > AVCodecContext *c = st->codec; > c->width = pCodecCtx->width; > c->height = pCodecCtx->height; > > av_init_packet(&packet); > frameYUV = avcodec_alloc_frame(); > > //Determine how big the buffer will need to be to store the captured frame > numBytes = > avpicture_get_size(STREAM_PIX_FMT,pCodecCtx->width,pCodecCtx->height); > > //Allocate the needed buffer size > buffer = new uint8_t[numBytes]; > sws_ctx = > sws_getContext(pCodecCtx->width,pCodecCtx->height,pCodecCtx->pix_fmt, > pCodecCtx->width,pCodecCtx->height, > STREAM_PIX_FMT,SWS_BICUBIC,NULL,NULL,NULL); > > //Fill the output frame > avpicture_fill((AVPicture > *)frameYUV,buffer,STREAM_PIX_FMT,pCodecCtx->width,pCodecCtx->height); > > //Read a video frame in > av_read_frame(pFormatCtx,&packet); > > //Decode the contents of packet into pFrame > avcodec_decode_video2(pCodecCtx,pFrame,&frameFinished,&packet); > > //Scale pFrame into frameYUV, and convert to PIXFMTYUV420P > sws_scale > ( > sws_ctx, > (uint8_t const * const *)pFrame->data, > pFrame->linesize, > 0, > pCodecCtx->height, > frameYUV->data, > frameYUV->linesize > ); > av_init_packet(&samsPacket); > //Encode frameYUV > avcodec_encode_video2(c, &samsPacket, frameYUV, &gotSamsPacket); > > AVPacket pkt = { 0 }; > int got_packet; > av_init_packet(&pkt); > // encode the image > ret = avcodec_encode_video2(c, &pkt, frame, &got_packet); > if (ret < 0){ > debugLogStreamSave->debug("Error encoding video frame"); > exit(1); > } > if (!ret && got_packet && pkt.size){ > pkt.stream_index = st->index; > > // Write the compressed frame to our output > ret = av_interleaved_write_frame(oc, &pkt); > > Really scratching my head over this one, any help would be really > appreciated! > > > > -- > View this message in context: > http://libav-users.943685.n4.nabble.com/Encoding-FLV-gives-green-screen-output-tp4657503.html > Sent from the libav-users mailing list archive at Nabble.com. > _______________________________________________ > Libav-user mailing list > [email protected] > http://ffmpeg.org/mailman/listinfo/libav-user _______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
