<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le lun. 4 nov. 2019 à 11:47, Andrew Randrianasulu <<a href="mailto:randrianasulu@gmail.com">randrianasulu@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">В сообщении от Monday 04 November 2019 12:29:10 Boris написал(а):<br>
> Hello,<br>
> I want to transcode video with exactly the same properties of the input<br>
> video in the output video.<br>
> I use the transcoding.cc code. In the static int open_output_file(const<br>
> char *filename) function, I set  encoder parameters like this :<br>
> <br>
> if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO)<br>
>                         {<br>
>                                 enc_ctx->height = dec_ctx->height;<br>
>                                 enc_ctx->width = dec_ctx->width;<br>
>                                 enc_ctx->sample_aspect_ratio =<br>
> dec_ctx->sample_aspect_ratio;<br>
> <br>
> enc_ctx->global_quality=dec_ctx->global_quality;<br>
>                                 enc_ctx->gop_size=dec_ctx->gop_size;<br>
>                                 enc_ctx->bit_rate=dec_ctx->bit_rate;<br>
>                                 enc_ctx->time_base=dec_ctx->time_base;<br>
>                                 enc_ctx->delay=dec_ctx->delay;<br>
> <br>
> //**********************************************<br>
>                                 enc_ctx->rc_max_rate=dec_ctx->rc_max_rate;<br>
>                                 enc_ctx->rc_min_rate=dec_ctx->rc_min_rate;<br>
>                                 /* take first format from list of supported<br>
> formats */<br>
>                                 if (encoder->pix_fmts)<br>
>                                 {<br>
>                                         enc_ctx->pix_fmt =<br>
> encoder->pix_fmts[0];<br>
>                                 }<br>
>                                 else<br>
>                                 {<br>
>                                         enc_ctx->pix_fmt = dec_ctx->pix_fmt;<br>
>                                 }<br>
>                                 // video time_base can be set to whatever<br>
> is handy and supported by encoder<br>
>                                 // enc_ctx->time_base =<br>
> av_inv_q(dec_ctx->framerate);<br>
>                         }<br>
>                         else<br>
>                         {<br>
>                                 enc_ctx->sample_rate = dec_ctx->sample_rate;<br>
>                                 enc_ctx->channel_layout =<br>
> dec_ctx->channel_layout;<br>
>                                 enc_ctx->channels =<br>
> av_get_channel_layout_nb_channels(enc_ctx->channel_layout);<br>
>                                 /* take first format from list of supported<br>
> formats */<br>
>                                 enc_ctx->sample_fmt =<br>
> encoder->sample_fmts[0];<br>
>                                 enc_ctx->time_base = (AVRational){1,<br>
> enc_ctx->sample_rate};<br>
>                         }<br>
>                         /* Third parameter can be used to pass settings to<br>
> encoder */<br>
>                         ret = avcodec_open2(enc_ctx, encoder, NULL);<br>
>                         if (ret < 0)<br>
>                         {<br>
>                                 av_log(NULL, AV_LOG_ERROR, "Cannot open<br>
> video encoder for stream #%u\n", i);<br>
>                                 return ret;<br>
>                         }<br>
>                         ret =<br>
> avcodec_parameters_from_context(out_stream->codecpar, enc_ctx);<br>
>                         if (ret < 0)<br>
>                         {<br>
>                                 av_log(NULL, AV_LOG_ERROR, "Failed to copy<br>
> encoder parameters to output stream #%u\n", i);<br>
>                                 return ret;<br>
>                         }<br>
>                         if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)<br>
>                                 enc_ctx->flags |=<br>
> AV_CODEC_FLAG_GLOBAL_HEADER;<br>
> <br>
>                         out_stream->time_base = enc_ctx->time_base;<br>
> <br>
> <br>
> But when I run exiftool on output  video and on input video, some values<br>
> like video duration, encoder, bit rate,  are differente.<br>
<br>
Hm, video duration chnage sounds like most unwelcome one ... <br>
But are codec parameters even supposed to be the same after different encoder run over output of another encoder?  </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I recall term 'bit exact', but is this applicable to re-encoding with lossy codecs?<br></blockquote><div><br></div><div>I'm not sure but I thought it could be done. If you have things that I do not know, do not hesitate to share them with me,please.</div><div><br></div><div>Regards</div><div> </div><div>Hello </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> Can someone tells me how can I do to keep the same parameters (metada) of<br>
> the input video in the output video, please?<br>
> <br>
> The entire open_output_file function is the following :<br>
> <br>
> static int open_output_file(const char *filename)<br>
> {<br>
>          AVStream *out_stream;<br>
>         AVStream *in_stream;<br>
>         AVCodecContext *dec_ctx, *enc_ctx;<br>
>         AVCodec *encoder;<br>
>         int ret;<br>
>         unsigned int i;<br>
>         ofmt_ctx = NULL;<br>
>         avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, filename);<br>
>         if (!ofmt_ctx)<br>
>         {<br>
>                 av_log(NULL, AV_LOG_ERROR, "Could not create output<br>
> context\n");<br>
>                 return AVERROR_UNKNOWN;<br>
>         }<br>
> <br>
>         for (i = 0; i < ifmt_ctx->nb_streams; i++)<br>
>         {<br>
>                 out_stream = avformat_new_stream(ofmt_ctx, NULL);<br>
>                 if (!out_stream)<br>
>                 {<br>
>                         av_log(NULL, AV_LOG_ERROR, "Failed allocating<br>
> output stream\n");<br>
>                         return AVERROR_UNKNOWN;<br>
>                 }<br>
> <br>
>                 in_stream = ifmt_ctx->streams[i];<br>
>                 dec_ctx = stream_ctx[i].dec_ctx;<br>
> <br>
>                 if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||<br>
> dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO)<br>
>                 {<br>
>                         //AVCodecID codec_id = dec_ctx->codec_type ==<br>
> AVMEDIA_TYPE_VIDEO ? AV_CODEC_ID_MPEG4:dec_ctx->codec_id;<br>
>                         /* in this example, we choose transcoding to same<br>
> codec */<br>
>                         //encoder = dec_ctx->codec_type ==<br>
> AVMEDIA_TYPE_VIDEO ?<br>
> avcodec_find_encoder(AV_CODEC_ID_H264):avcodec_find_encoder(dec_ctx->codec_id);//(AV_CODEC_ID_MPEG4):avcodec_find_encoder(dec_ctx->codec_id);<br>
>                         encoder = dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO<br>
> ?<br>
> avcodec_find_encoder(AV_CODEC_ID_MPEG4):avcodec_find_encoder(dec_ctx->codec_id);<br>
>                         // if(dec_ctx->codec_type ==<br>
> AVMEDIA_TYPE_VIDEO){encoder=avcodec_find_encoder(AV_CODEC_ID_MPEG4);}else{encoder=avcodec_find_encoder(dec_ctx->codec_id);}<br>
>                         //encoder = avcodec_find_encoder(dec_ctx->codec_id);<br>
>                         if (!encoder)<br>
>                         {<br>
>                                 av_log(NULL, AV_LOG_FATAL, "Necessary<br>
> encoder not found\n");<br>
>                                 return AVERROR_INVALIDDATA;<br>
>                         }<br>
>                         enc_ctx = avcodec_alloc_context3(encoder);<br>
>                         if (!enc_ctx)<br>
>                         {<br>
>                                 av_log(NULL, AV_LOG_FATAL, "Failed to<br>
> allocate the encoder context\n");<br>
>                                 return AVERROR(ENOMEM);<br>
>  }<br>
> <br>
>                         /* In this example, we transcode to same properties<br>
> (picture size,<br>
>                         * sample rate etc.). These properties can be<br>
> changed for output<br>
>                         * streams easily using filters */<br>
>                         if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO)<br>
>                         {<br>
>                                 enc_ctx->height = dec_ctx->height;<br>
>                                 enc_ctx->width = dec_ctx->width;<br>
>                                 enc_ctx->sample_aspect_ratio =<br>
> dec_ctx->sample_aspect_ratio;<br>
> <br>
> enc_ctx->global_quality=dec_ctx->global_quality;<br>
>                                 enc_ctx->gop_size=dec_ctx->gop_size;<br>
>                                 enc_ctx->bit_rate=dec_ctx->bit_rate;<br>
>                                 enc_ctx->time_base=dec_ctx->time_base;<br>
>                                 enc_ctx->delay=dec_ctx->delay;<br>
> <br>
> //**********************************************<br>
>                                 enc_ctx->rc_max_rate=dec_ctx->rc_max_rate;<br>
>                                 enc_ctx->rc_min_rate=dec_ctx->rc_min_rate;<br>
>                                 /* take first format from list of supported<br>
> formats */<br>
>                                 if (encoder->pix_fmts)<br>
>                                 {<br>
>                                         enc_ctx->pix_fmt =<br>
> encoder->pix_fmts[0];<br>
>                                 }<br>
>                                 else<br>
>                                 {<br>
>                                         enc_ctx->pix_fmt = dec_ctx->pix_fmt;<br>
>                                 }<br>
>                                 // video time_base can be set to whatever<br>
> is handy and supported by encoder<br>
>                                 // enc_ctx->time_base =<br>
> av_inv_q(dec_ctx->framerate);<br>
>                         }<br>
>                         else<br>
>                         {<br>
>                                 enc_ctx->sample_rate = dec_ctx->sample_rate;<br>
>                                 enc_ctx->channel_layout =<br>
> dec_ctx->channel_layout;<br>
>                                 enc_ctx->channels =<br>
> av_get_channel_layout_nb_channels(enc_ctx->channel_layout);<br>
>                                 /* take first format from list of supported<br>
> formats */<br>
>                                 enc_ctx->sample_fmt =<br>
> encoder->sample_fmts[0];<br>
>                                 enc_ctx->time_base = (AVRational){1,<br>
> enc_ctx->sample_rate};<br>
>                         }<br>
>                         /* Third parameter can be used to pass settings to<br>
> encoder */<br>
>                         ret = avcodec_open2(enc_ctx, encoder, NULL);<br>
>                         if (ret < 0)<br>
>                         {<br>
>                                 av_log(NULL, AV_LOG_ERROR, "Cannot open<br>
> video encoder for stream #%u\n", i);<br>
>                                 return ret;<br>
>                         }<br>
>                         ret =<br>
> avcodec_parameters_from_context(out_stream->codecpar, enc_ctx);<br>
>                         if (ret < 0)<br>
>                         {<br>
>                                 av_log(NULL, AV_LOG_ERROR, "Failed to copy<br>
> encoder parameters to output stream #%u\n", i);<br>
>                                 return ret;<br>
>                         }<br>
>                         if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)<br>
>  enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;<br>
> <br>
>                         out_stream->time_base = enc_ctx->time_base;<br>
>                         stream_ctx[i].enc_ctx = enc_ctx;<br>
>                 }<br>
>                 else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN)<br>
>                 {<br>
>                         av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d<br>
> is of unknown type, cannot proceed\n", i);<br>
>                         return AVERROR_INVALIDDATA;<br>
>                 }<br>
>                 else<br>
>                 {<br>
>                         // if this stream must be remuxed<br>
>                         ret = avcodec_parameters_copy(out_stream->codecpar,<br>
> in_stream->codecpar);<br>
>                         //ifmt_ctx->streams[i]->codec);<br>
>                         if (ret < 0)<br>
>                         {<br>
>                                 av_log(NULL, AV_LOG_ERROR, "Copying<br>
> parameters for stream #%u failed\n", i);<br>
>                                 return ret;<br>
>                         }<br>
>                         out_stream->time_base = in_stream->time_base;<br>
>                 }<br>
> <br>
>         }<br>
>         av_dump_format(ofmt_ctx, 0, filename, 1);<br>
> <br>
>         if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE))<br>
>         {<br>
>                 ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);<br>
>                 if (ret < 0)<br>
>                 {<br>
>                         av_log(NULL, AV_LOG_ERROR, "Could not open output<br>
> file '%s'", filename);<br>
>                         return ret;<br>
>                 }<br>
>         }<br>
> <br>
>         /* init muxer, write output file header */<br>
>         ret = avformat_write_header(ofmt_ctx, NULL);<br>
>         if (ret < 0)<br>
>         {<br>
>                 av_log(NULL, AV_LOG_ERROR, "Error occurred when opening<br>
> output file\n");<br>
>                 return ret;<br>
>         }<br>
>         return 0;<br>
> }<br>
> <br>
> Rgards<br>
> <br>
<br>
<br>
_______________________________________________<br>
Libav-user mailing list<br>
<a href="mailto:Libav-user@ffmpeg.org" target="_blank">Libav-user@ffmpeg.org</a><br>
<a href="https://ffmpeg.org/mailman/listinfo/libav-user" rel="noreferrer" target="_blank">https://ffmpeg.org/mailman/listinfo/libav-user</a><br>
<br>
To unsubscribe, visit link above, or email<br>
<a href="mailto:libav-user-request@ffmpeg.org" target="_blank">libav-user-request@ffmpeg.org</a> with subject "unsubscribe".</blockquote></div></div>