[Libav-user] h264 Encoding problems

Zac Shenker zac at zacshenker.com
Wed Nov 9 07:35:35 CET 2011


Thanks Matthew.

That all helped, but I am still finding that if I do not set the pts before
my call to avcodec_encode_video I keep getting "non-strictly-monotonic PTS"
warning messages.

Do you not set the pts value on your AVFrame* before encoding?

Regards,
Zac Shenker

On Sat, Nov 5, 2011 at 3:16 AM, Matthew Einhorn <moiein2000 at gmail.com>wrote:

> On Fri, Nov 4, 2011 at 2:40 AM, Zac Shenker <zac at zacshenker.com> wrote:
> > Hi,
> > I have started working on some code based on the decoding_encoding.c
> sample
> > file to encode the test pattern as h.264 video.
> > The settings I am using on my AVCodecContext is as follows:
> > c->width = 352;
> > c->height = 288;
> > c->time_base.num = 1;
> > c->time_base.den = 25;
> > c->pix_fmt = PIX_FMT_YUV420P;
> > c->gop_size = 1;
> > if(codec_id == CODEC_ID_H264)
> >
> > av_opt_set(c->priv_data, "preset", "slow", 0);
> >
> > I am having a number of issues:
> > 1) Even when I set the AVFrame->pts to AVS_NOPTS_VALUE, I still get
> > "non-strictly-monotonic PTS" warning messages. How should I be setting
> the
> > PTS value?
>
> See my code below. I don't set the pts or anything else in the frame
> other than copying the image data to the picture.
>
> > 2) For the first 13 frames my call to avcodec_encode_video returns a
> size of
> > 0, should this be happening?
> Yes, because it needs to buffer a couple of frames so it can calculate
> best compression.
>
> > 3) The output file that gets written does not seem to have a
> duration(using
> > ffprobe or VLC to check)
>
> Maybe you have to write the header and trailer before and after the
> video is written. I.e. avformat_write_header(m_pFormatCtx, NULL) and
> av_write_trailer(m_pFormatCtx);
>
> > So far to figure out how things work I have been searching through the
> > ffmpeg & x264 source, is there any up-to-date examples of doing h264
> video
> > encoding (no audio) anywhere?
>
> Look in ffmpeg.c and ffplay.c
>
>
>
> Here's how my code looks:
> if (m_pFormatCtx->oformat->flags & AVFMT_RAWPICTURE)
>        {
>                /* raw video case. The API will change slightly in the near
>                future for that. Latency won't happen here.  */
>                AVPacket sPkt;
>                av_init_packet(&sPkt);
>
>                sPkt.flags |= AV_PKT_FLAG_KEY;
>                sPkt.stream_index= m_pAVStream->index;
>                sPkt.data= (unsigned char *)m_pAVFrame;
>                sPkt.size= sizeof(AVPicture);
>
>                nRes = av_interleaved_write_frame(m_pFormatCtx, &sPkt);
>        } else
>        {
>                /* Encode the image, if flushing pass null frame. */
>                nTemp = avcodec_encode_video(pCodecCtx, m_auchVideoOutBuf,
> m_nBuffer,
>                        auchBuffer?m_pAVFrame:NULL);
>                /* If zero size, it means the image was buffered and will
> need to be
> flushed later. */
>                if (nTemp > 0)
>                {
>                        AVPacket sPkt;
>                        av_init_packet(&sPkt);
>
>                        // Save pts of frame
>                        if (pCodecCtx->coded_frame &&
> pCodecCtx->coded_frame->pts != AV_NOPTS_VALUE)
>                                sPkt.pts=
> av_rescale_q(pCodecCtx->coded_frame->pts,
> pCodecCtx->time_base, m_pAVStream->time_base);
>                        if(sPkt.pts == AV_NOPTS_VALUE && sPkt.dts ==
> AV_NOPTS_VALUE &&
> !(m_pFormatCtx->oformat->flags & AVFMT_NOTIMESTAMPS))
>                                sPkt.dts= 0;
>
>                        // Is it a key frame?
>                        if(pCodecCtx->coded_frame &&
> pCodecCtx->coded_frame->key_frame)
>                                sPkt.flags |= AV_PKT_FLAG_KEY;
>                        sPkt.stream_index= m_pAVStream->index;
>                        sPkt.data= m_auchVideoOutBuf;
>                        sPkt.size= nTemp;
>                        /* Write the compressed frame in the media file */
>                        nRes = av_interleaved_write_frame(m_pFormatCtx,
> &sPkt);
>                } else
>                {
>                        nRes = nTemp;   // If zero it's ok, if none zero it
> means error.
>                        if (!auchBuffer)        // Either way, no more
> frames to flush, if flushing
>                                m_bDone= true;
>                }
>        }
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20111109/d93e1822/attachment.html>


More information about the Libav-user mailing list