On Fri, Nov 4, 2011 at 2:40 AM, Zac Shenker <z...@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@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to