<div dir="ltr"><div>I am have trouble encoding an H264 video correctly using FFmpeg libav. I could not play the encoded video in VLC media player, and although I could play the video on MPC-HC the time shows 00:00/00:00. Clearly I'm missing something.</div><div><br></div><div>The Media info from MPC-HC shows this:</div><div>  </div><div>    General  </div><div>    Format                         : AVC  </div><div>    Format/Info                    : Advanced Video Codec  </div><div>    File size                      : 110 KiB  </div><div>    Duration                       : 2s 400ms  </div><div>    Overall bit rate               : 375 Kbps  </div><div>    Writing library                : x264 core 148 r2665 a01e339  </div><div>    Encoding settings              : cabac=0 / ref=3 / deblock=1:0:0 / analyse=0x1:0x111 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=7 / lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=12 / keyint_min=1 / scenecut=40 / intra_refresh=0 / rc_lookahead=12 / rc=abr / mbtree=1 / bitrate=2000 / ratetol=1.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00  </div><div>      </div><div>    Video  </div><div>    Format                         : AVC  </div><div>    Format/Info                    : Advanced Video Codec  </div><div>    Format profile                 : Baseline@L2.1  </div><div>    Format settings, CABAC         : No  </div><div>    Format settings, ReFrames      : 3 frames  </div><div>    Format settings, GOP           : M=1, N=12  </div><div>    Duration                       : 2s 400ms  </div><div>    Bit rate                       : 2 000 Kbps  </div><div>    Width                          : 320 pixels  </div><div>    Height                         : 240 pixels  </div><div>    Display aspect ratio           : 4:3  </div><div>    Frame rate mode                : Variable  </div><div>    Frame rate                     : 20.833 fps  </div><div>    Color space                    : YUV  </div><div>    Chroma subsampling             : 4:2:0  </div><div>    Bit depth                      : 8 bits  </div><div>    Scan type                      : Progressive  </div><div>    Bits/(Pixel*Frame)             : 1.250  </div><div>    Stream size                    : 586 KiB  </div><div>    Writing library                : x264 core 148 r2665 a01e339  </div><div>    Encoding settings              : cabac=0 / ref=3 / deblock=1:0:0 / analyse=0x1:0x111 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=7 / lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=12 / keyint_min=1 / scenecut=40 / intra_refresh=0 / rc_lookahead=12 / rc=abr / mbtree=1 / bitrate=2000 / ratetol=1.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00   </div><div><br></div><div>I noticed something odd in the above info: </div><div>- The frame rate is 20.833 fps, instead of the specified 10 fps. </div><div>- Duration of 2s 400ms did not seem right either, since the video played for more than 4s.</div><div><br></div><div>Also, (AVFrame* picture)->pict_type is always set to AV_PICTURE_TYPE_NONE. Is this normal?</div><div> </div><div>The library that I'm using is ffmpeg-20160219-git-98a0053-win32-dev. I would really really appreciate if you could help me out of this confusion. </div><div><br></div><div>/*</div><div> * Video encoding example</div><div> */</div><div>char filename[] = "test.mp4";</div><div>int main(int argc, char argv)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>AVCodec *codec = NULL;</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>AVCodecContext *codecCtx= NULL;</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>AVFormatContext *pFormatCtx = NULL;</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>AVStream * pVideoStream = NULL;</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>AVFrame *picture = NULL;</div><div><span class="Apple-tab-span" style="white-space:pre">     </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>int i, x, y,            //</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>ret, <span class="Apple-tab-span" style="white-space:pre">                               </span>// Return value</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>got_packet_ptr;     // Data encoded into packet</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>printf("Video encoding\n");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// Register all formats and codecs</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>av_register_all();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">  </span>// allocate context</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>pFormatCtx = avformat_alloc_context();</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>memcpy(pFormatCtx->filename,filename,</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>min(strlen(filename), sizeof(pFormatCtx->filename)));</div><div><span class="Apple-tab-span" style="white-space:pre">     </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// guess format</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>pFormatCtx->oformat = av_guess_format("h264", NULL, NULL);</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>if (NULL==pFormatCtx->oformat)</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>cerr << "Could not guess output format" << endl;</div><div><span class="Apple-tab-span" style="white-space:pre">               </span>return -1;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>}<span class="Apple-tab-span" style="white-space:pre">   </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// Find the codec.</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>codec = avcodec_find_encoder(pFormatCtx->oformat->video_codec);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (codec == NULL) {</div><div><span class="Apple-tab-span" style="white-space:pre">         </span>fprintf(stderr, "Codec not found\n");</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>return -1;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">    </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// Set context</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>int framerate = 10;</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>codecCtx = avcodec_alloc_context3(codec);</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>avcodec_get_context_defaults3(codecCtx, codec); </div><div><span class="Apple-tab-span" style="white-space:pre">    </span>codecCtx->pix_fmt = AV_PIX_FMT_YUV420P;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>codecCtx->profile = FF_PROFILE_H264_BASELINE; </div><div><span class="Apple-tab-span" style="white-space:pre">   </span>// Resolution must be a multiple of two.</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>codecCtx->width  = 320;</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>codecCtx->height = 240;</div><div><span class="Apple-tab-span" style="white-space:pre">           </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>codecCtx->bit_rate = 2000000;</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>codecCtx->time_base.den = framerate;</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>codecCtx->time_base.num = 1;</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>codecCtx->gop_size = 12; // emit one intra frame every twelve frames at most</div><div><span class="Apple-tab-span" style="white-space:pre">      </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// Open the codec.<span class="Apple-tab-span" style="white-space:pre">  </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>if (avcodec_open2(codecCtx, codec, NULL) < 0) </div><div><span class="Apple-tab-span" style="white-space:pre">   </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>printf("Cannot open video codec\n");</div><div><span class="Apple-tab-span" style="white-space:pre">               </span>return -1;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">    </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// Add stream to pFormatCtx</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>pVideoStream = avformat_new_stream(pFormatCtx, codec);</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>if (!pVideoStream) </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>printf("Cannot add new video stream\n");</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>return -1;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>pVideoStream->codec = codecCtx;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>pVideoStream->time_base.den = framerate;</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>pVideoStream->time_base.num = 1;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>if (avio_open2(&pFormatCtx->pb, filename, AVIO_FLAG_WRITE, NULL, NULL) < 0) </div><div><span class="Apple-tab-span" style="white-space:pre">      </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>printf("Cannot open file\n");</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>return -1;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">    </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// Write file header.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>avformat_write_header(pFormatCtx, NULL);</div><div><span class="Apple-tab-span" style="white-space:pre">     </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// Create frame</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>picture= av_frame_alloc();</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>picture->format = codecCtx->pix_fmt;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>picture->width  = codecCtx->width;</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>picture->height = codecCtx->height;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>int bufferImgSize = av_image_get_buffer_size(codecCtx->pix_fmt, codecCtx->width,</div><div><span class="Apple-tab-span" style="white-space:pre">                                       </span>codecCtx->height,1);<span class="Apple-tab-span" style="white-space:pre">     </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>av_image_alloc(picture->data, picture->linesize, codecCtx->width, codecCtx->height, <span class="Apple-tab-span" style="white-space:pre">                            </span>codecCtx->pix_fmt, 32);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">  </span>AVPacket avpkt;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>/* encode 1 second of video */</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>for(i=0;i<50;i++) </div><div><span class="Apple-tab-span" style="white-space:pre">       </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>/* prepare a dummy image */</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>/* Y */</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>for(y=0;y<codecCtx->height;y++)</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>for(x=0;x<codecCtx->width;x++) </div><div><span class="Apple-tab-span" style="white-space:pre">                       </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                            </span>picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>/* Cb and Cr */</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>for(y=0;y<codecCtx->height/2;y++) </div><div><span class="Apple-tab-span" style="white-space:pre">            </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>for(x=0;x<codecCtx->width/2;x++) </div><div><span class="Apple-tab-span" style="white-space:pre">                     </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                            </span>picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2;</div><div><span class="Apple-tab-span" style="white-space:pre">                              </span>picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5;</div><div><span class="Apple-tab-span" style="white-space:pre">                       </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">           </span>// Get timestamp</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>picture->pts = (float) i * (1000.0/(float)(codecCtx->time_base.den)) * 90; </div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">          </span>// Encode frame to packet</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>av_init_packet(&avpkt);</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>got_packet_ptr = 0;</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>int error = avcodec_encode_video2(codecCtx, &avpkt, picture, &got_packet_ptr);</div><div><span class="Apple-tab-span" style="white-space:pre">               </span>if (!error && got_packet_ptr > 0) </div><div><span class="Apple-tab-span" style="white-space:pre">               </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>// Write packet with frame.</div><div><span class="Apple-tab-span" style="white-space:pre">                  </span>ret = (av_interleaved_write_frame(pFormatCtx, &avpkt) == 0);<span class="Apple-tab-span" style="white-space:pre">            </span></div><div><span class="Apple-tab-span" style="white-space:pre">             </span>}<span class="Apple-tab-span" style="white-space:pre">   </span></div><div><span class="Apple-tab-span" style="white-space:pre">             </span>av_packet_unref(&avpkt); </div><div><span class="Apple-tab-span" style="white-space:pre">       </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>// Flush remaining encoded data</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>while(1)</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>av_init_packet(&avpkt);</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>got_packet_ptr = 0;</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>// Encode frame to packet.</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>int error = avcodec_encode_video2(codecCtx, &avpkt, NULL, &got_packet_ptr);</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>if (!error && got_packet_ptr > 0) </div><div><span class="Apple-tab-span" style="white-space:pre">               </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>// Write packet with frame.</div><div><span class="Apple-tab-span" style="white-space:pre">                  </span>ret = (av_interleaved_write_frame(pFormatCtx, &avpkt) == 0);<span class="Apple-tab-span" style="white-space:pre">            </span></div><div><span class="Apple-tab-span" style="white-space:pre">             </span>} </div><div><span class="Apple-tab-span" style="white-space:pre">          </span>else </div><div><span class="Apple-tab-span" style="white-space:pre">               </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>break;</div><div><span class="Apple-tab-span" style="white-space:pre">               </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>av_packet_unref(&avpkt); </div><div><span class="Apple-tab-span" style="white-space:pre">       </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>av_write_trailer(pFormatCtx);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>av_packet_unref(&avpkt);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>av_frame_free(&picture);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>avcodec_close(codecCtx);</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>av_free(codecCtx);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">  </span>cin.get();</div><div>}</div></div>