ffmpeg中av_interleaved_write_frame函数的源码分析及其用法

fmpeg中av_interleaved_write_frame的源码。
  1. int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
  2.     AVStream *st= s->streams[ pkt->stream_index];
  3.     int ret;

  4.     //FIXME/XXX/HACK drop zero sized packets
  5.     if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && pkt->size==0)
  6.         return 0;

  7.     av_dlog(s, "av_interleaved_write_frame size:%d dts:%"PRId64" pts:%"PRId64"\n",
  8.             pkt->size, pkt->dts, pkt->pts);
  9.     if((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
  10.         return ret;

  11.     if(pkt->dts == AV_NOPTS_VALUE && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
  12.         return AVERROR(EINVAL);

  13.     for(;;){
  14.         AVPacket opkt;
  15.         int ret= interleave_packet(s, &opkt, pkt, 0);
  16.         if(ret<=0) //FIXME cleanup needed for ret<0 ?
  17.             return ret;

  18.         ret= s->oformat->write_packet(s, &opkt);
  19.         if (ret >= 0)
  20.             s->streams[opkt.stream_index]->nb_frames++;

  21.         av_free_packet(&opkt);
  22.         pkt= NULL;

  23.         if(ret<0)
  24.             return ret;
  25.         if(s->pb && s->pb->error)
  26.             return s->pb->error;
  27.     }
  28. }
复制代码


我在编码的时候采用如下的代码:
  1. AVPacket pkt;
  2.         av_init_packet(&pkt);

  3.         if(c->coded_frame->pts != AV_NOPTS_VALUE)
  4.                 {
  5.             pkt.pts = av_rescale_q(c->coded_frame->pts,c->time_base,en_info->video_st->time_base);
  6.                 }
  7.         if(c->coded_frame->key_frame)
  8.             pkt.flags |= AV_PKT_FLAG_KEY;
  9.         pkt.stream_index = en_info->video_st->index;
  10.         pkt.data = en_info->video_outbuf;
  11.         pkt.size = en_info->out_size;
  12.         ret = av_interleaved_write_frame( en_info->oc , &pkt );
复制代码

你可能感兴趣的:(ffmpeg中av_interleaved_write_frame函数的源码分析及其用法)