Muxing AVPackets into mp4 file

后端 未结 2 1972
再見小時候
再見小時候 2021-02-06 13:20

I am developing a tool which receives a h.264 live stream from the network (the sender is a hardware encoder), buffers the last x-minutes and creates a video file of the last x-

相关标签:
2条回答
  • 2021-02-06 13:50

    This might not be the case, but avformat_write_header function should be used for writing header instead of function pointer in AVOutputFormat.write_header

    0 讨论(0)
  • 2021-02-06 14:04

    This is a general scheme shows how to mux video file from an existing packets

    AVOutputFormat * outFmt = av_guess_format("mp4", NULL, NULL);
    AVFormatContext *outFmtCtx = NULL;
    avformat_alloc_output_context2(&outFmtCtx, outFmt, NULL, NULL);
    AVStream * outStrm = av_new_stream(outFmtCtx, 0);
    
    AVCodec * codec = NULL;
    avcodec_get_context_defaults3(outStrm->codec, codec);
    outStrm->codec->coder_type = AVMEDIA_TYPE_VIDEO;
    
    ///....
    /// set some required value, such as
    /// outStrm->codec->flags
    /// outStrm->codec->sample_aspect_ratio
    /// outStrm->disposition
    /// outStrm->codec->codec_tag
    /// outStrm->codec->bits_per_raw_sample
    /// outStrm->codec->chroma_sample_location
    /// outStrm->codec->codec_id
    /// outStrm->codec->codec_tag
    /// outStrm->codec->time_base
    /// outStrm->codec->extradata 
    /// outStrm->codec->extradata_size
    /// outStrm->codec->pix_fmt
    /// outStrm->codec->width
    /// outStrm->codec->height
    /// outStrm->codec->sample_aspect_ratio
    /// see ffmpeg.c for details  
    
    avio_open(&outFmtCtx->pb, outputFileName, AVIO_FLAG_WRITE);
    
    avformat_write_header(outFmtCtx, NULL);
    
    for (...)
    {
    av_write_frame(outFmtCtx, &pkt);
    }
    
    av_write_trailer(outFmtCtx);
    avio_close(outFmtCtx->pb);
    avformat_free_context(outFmtCtx);
    

    For troubleshooting, it is useful to set detailed logging: av_log_set_level(AV_LOG_DEBUG);

    0 讨论(0)
提交回复
热议问题