Hello, thanks I solved the problem. I have used the wrong container format for CODEC_ID_RAWVIDEO seems it should be an avi container not mpg like I used first.
Cheers Christoph -------- Original-Nachricht -------- > Datum: Fri, 27 Mar 2009 13:23:04 +0100 > Von: Alex <[email protected]> > An: Libav* user questions and discussions <[email protected]> > Betreff: Re: [libav-user] capturing a live stream > I had a simular problem and I solved it by not putting the ffmpeg code > in a class. I don't know weather this is a good or acceptable solution. > > greetings fencer > Christoph John schrieb: > > Hello, > > I am trying to capture a live stream from a webcam. I have used the > output_example.c code as an example. But when I call > av_interleaved_write_frame() I always get an buffer underflow error. Has > somebody an idea what I am > doing wrong here? > > > > The following methods I use for capture initialization and writing the > frames. Thanks for your help > > > > Christoph > > > > > /***************************************************************************/ > > bool FFMPEG_VideoWriter::initCapture(const QString &strFileName, float > fFrameRate, > > const > > Vec2D<double> &v2dImageRes, bool bColor) > > { > > QString strFile = strCapturePath + strFileName; > > // start from clean state > > deinitCapture(); > > > > // create container format description > > m_pOutputFormat = guess_format(NULL, (const char*)strFile.toLatin1(), > NULL); > > if (!m_pOutputFormat) > > { > > cout<<"FFMPEG_VideoWriter: Could not deduce output format from > > file > extension: using MPEG"<<endl; > > m_pOutputFormat = guess_format("mpeg", NULL, NULL); > > if (!m_pOutputFormat) > > cout<<"FFMPEG_VideoWriter: Could not find mpeg output > > format"<<endl; > > } > > > > // FIXME codec choice > > m_pOutputFormat->video_codec = CODEC_ID_RAWVIDEO; > > > > // select appropriate pixel format > > if(bColor) > > m_iInputPixFormat = PIX_FMT_RGB32_1; > > else > > m_iInputPixFormat = PIX_FMT_GRAY8; > > > > // allocate the output media context > > m_pFormatContext = av_alloc_format_context(); > > if (!m_pFormatContext) > > { > > cout<<"FFMPEG_VideoWriter: Memory error"<<endl; > > return false; > > } > > > > m_pFormatContext->oformat = m_pOutputFormat; > > _snprintf(m_pFormatContext->filename, > sizeof(m_pFormatContext->filename), "%s", (const char*)strFile.toLatin1()); > > > > ///////////////////// create stream and configure the codec context > ////////////////////////// > > m_pVideoStreamFFMPEG = av_new_stream(m_pFormatContext, 0); > > if(!m_pVideoStreamFFMPEG) > > { > > cout<<"FFMPEG_VideoWriter: Could not alloc video stream"<<endl; > > } > > AVCodecContext* pCodecContext = m_pVideoStreamFFMPEG->codec; > > pCodecContext->codec_id = m_pOutputFormat->video_codec; > > pCodecContext->codec_type = CODEC_TYPE_VIDEO; > > > > pCodecContext->bit_rate = v2dImageRes.m_x * v2dImageRes.m_y * 4 * > fFrameRate * 8; > > pCodecContext->width = (int)v2dImageRes.m_x; > > pCodecContext->height = (int)v2dImageRes.m_y; > > > > pCodecContext->time_base.num = 1; > > pCodecContext->time_base.den = fFrameRate; > > > > pCodecContext->pix_fmt = (PixelFormat)m_iInputPixFormat; > > > > // some formats want stream headers to be separate > > if(m_pFormatContext->oformat->flags & AVFMT_GLOBALHEADER) > > pCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER; > > > > //init output params > > av_set_parameters(m_pFormatContext,NULL); > > > > //dump_format(m_pFormatContext,0,(const char*)strFile.toLatin1(),1); > > > > /////////////////////// open video file > ///////////////////////////////////////// > > // find encoder > > AVCodec *pCodec = avcodec_find_encoder(pCodecContext->codec_id); > > if (!pCodec) > > { > > cout<<"FFMPEG_VideoWriter: Codec not found"<<endl; > > return false; > > } > > > > // open the codec > > if (avcodec_open(pCodecContext, pCodec) < 0) > > { > > cout<<"FFMPEG_VideoWriter: Could not open codec"<<endl; > > return false; > > } > > > > // create data structure for source picture > > m_pInputPicture = allocPicture(pCodecContext->pix_fmt, > pCodecContext->width, pCodecContext->height, false); > > if (!m_pInputPicture) > > { > > return false; > > cout<<"FFMPEG_VideoWriter: Could not allocate picture"<<endl; > > } > > // create memory for compressed image, assume 32 bit pixel maximum > > m_uiCompressedImageBufSize = v2dImageRes.m_x*v2dImageRes.m_y*4; > > m_pCompressedImageBuf = (uint8_t *) > av_malloc(m_uiCompressedImageBufSize); > > > > // open the output file > > if(url_fopen(&m_pFormatContext->pb, m_pFormatContext->filename, > URL_WRONLY) < 0) > > { > > cout<<"FFMPEG_VideoWriter: Could not open file"<<endl; > > return false; > > } > > > > // write stream header > > av_write_header(m_pFormatContext); > > > > return true; > > } > > > > > /***************************************************************************/ > > bool FFMPEG_VideoWriter::writeImage(vil_image_resource_sptr pImg) > > { > > if(m_pFormatContext) > > { > > AVCodecContext* pCodecContext = m_pVideoStreamFFMPEG->codec; > > // set rgba input image > > if(pCodecContext->pix_fmt == PIX_FMT_RGB32_1 && pImg->nplanes() > > == 4 > && > > pCodecContext->width == pImg->ni() && > > pCodecContext->height == pImg->nj()) > > { > > avpicture_fill((AVPicture*)m_pInputPicture, > > > (uint8_t*)((vil_image_view<vxl_byte>)pImg->get_view()).top_left_ptr(), > > PIX_FMT_RGB32_1, > > pImg->ni(), pImg->nj()); > > > > } > > // set monochrome input image > > else if(pCodecContext->pix_fmt == PIX_FMT_GRAY8 && > > pImg->nplanes() == > 1 && > > pCodecContext->width == pImg->ni() && > > pCodecContext->height == pImg->nj()) > > { > > avpicture_fill((AVPicture*)m_pInputPicture, > > > (uint8_t*)((vil_image_view<vxl_byte>)pImg->get_view()).top_left_ptr(), > > PIX_FMT_GRAY8, > > pImg->ni(), pImg->nj()); > > } > > else > > return false; > > > > // compress image > > int iOutSize = avcodec_encode_video(pCodecContext, > m_pCompressedImageBuf, > > > > m_uiCompressedImageBufSize, m_pInputPicture); > > // serialize data > > if(iOutSize > 0) > > { > > // create data package > > AVPacket pkt; > > av_init_packet(&pkt); > > > > if (pCodecContext->coded_frame->pts != AV_NOPTS_VALUE) > > pkt.pts= av_rescale_q(pCodecContext->coded_frame->pts, > > > > pCodecContext->time_base, > > > > m_pVideoStreamFFMPEG->time_base); > > > > if(pCodecContext->coded_frame->key_frame) > > pkt.flags |= PKT_FLAG_KEY; > > > > pkt.stream_index= m_pVideoStreamFFMPEG->index; > > pkt.data= m_pCompressedImageBuf; > > pkt.size= iOutSize; > > > > // write the package into file > > av_interleaved_write_frame(m_pFormatContext, &pkt); > > } > > }// end format context > > > > return true; > > } > > > > > > > > > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user -- Neu: GMX FreeDSL Komplettanschluss mit DSL 6.000 Flatrate + Telefonanschluss für nur 17,95 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
