[Libav-user] Transcoding frame rate mismatch
Gonzalo GarramuƱo
ggarra13 at gmail.com
Tue Nov 5 15:18:30 EET 2019
I am glad someone finally answered this as I complained about this long
time ago, with no answer.
El 05/11/19 a las 09:36, Vassilis escribiĆ³:
> Well that did the trick! I can't thank you enough James and also
> second your comment that this should be updated in the transcoding.c
> example.
> Is there anything we can do about this?
>
I still cannot get it to work. I get a floating point exception with
the division of this in my code:
stream->avg_frame_rate.num * stream->avg_frame_rate.den;
Where are you guys setting the avg_frame_rate? The transcoding.c
example never sets it.
>
> On Tue, Nov 5, 2019 at 2:03 PM James Crisafulli <james2048 at gmail.com
> <mailto:james2048 at gmail.com>> wrote:
>
> Hi,
>
> I used to have the same issue with my application, which I based
> on transcoding.c (not transcoding but anyways, writing H264 to MP4
> file).
> You need to set the AVPacket duration field, for some reason it
> shows this issue if you let it automatically set it (set to -1).
> I had to do this both using libx264 and mpeg4 encoders.
>
> Example in my code from the muxing section:
>
> av_packet_rescale_ts(&packet, codecCtx->time_base, stream->time_base);
> packet.stream_index = 0;
> // probably best to write this as av_rescale_* functions, but this
> is old code
> // for example, if 25 FPS, and time_base is 12800, then
> packet.duration = 12800 / 25 = 512
> packet.duration = stream->time_base.den / stream->time_base.num /
> stream->avg_frame_rate.num * stream->avg_frame_rate.den;
> // now you can mux
> ret = av_interleaved_write_frame(formatCtx, &packet);
>
> I am not sure why this is needed, I found this in another codebase
> with a similar comment, and it fixed my issue.
>
> Might as well mention that in transcoding.c, it also doesn't set
> the GLOBAL_HEADER flag at the right time, and as such you get a
> malformed file if writing MP4 format. I noticed it wouldn't open
> in Adobe Premiere, and Windows 10 Films & TV player, and ffprobe
> had warnings about it as well but did manage to read it.
>
> // TOO LATE! has to be done before avcodec open!! In
> transcoding.c, it does this after the call and as such the flags
> are ignored.
> if (formatCtx->oformat->flags & AVFMT_GLOBALHEADER)
> {
> codecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
> }
>
> To fix that, I have hard coded the flag early when I know I am
> writing MP4, before avcodec_open():
>
> codecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
> AVDictionary *encoderOpts = nullptr;
> ret = avcodec_open2(codecCtx, codecCtx->codec, &encoderOpts);
>
> And now everything works well for me. Hopefully it fixed the
> issues for you as well.
> Would be nice to see transcoding.c updated to fix these small
> issues as it is used as a base by so many people looking into
> libav* development.
>
> - James
>
> On Tue, 5 Nov 2019 at 11:07, Vassilis <bpantazhs at gmail.com
> <mailto:bpantazhs at gmail.com>> wrote:
>
> This can not be reproduced with the ffmpeg cli, conversion
> works fine there.
> However it can be reproduced with transcoding.c for all input
> files.
> Additionally to what I mentioned, 29.96 fps test files result
> in 29.98 and 30 to 30.11.
> Another 24 fps file resulted in 24.03. The changes seem to be
> related with
> the duration of the file: the longer the file the shorter the
> marginal fps difference.
> The output frame rate can be determined with both fffmpeg -i
> as well as with
> QuickTime 7 and VLC. Like I mentioned, I have spent some time
> with investigating this
> and it looks like an issue with the correct conversion of the
> last frame; I was able
> to get different framerate values when tampering with the pts
> of the last frame
> but this looked like a nasty hack that I shouldn't be doing,
> plus it fails
> again when re-encoding the file. Here is the info from an
> input/output test file
> that has the frame rate changed from 24 fps to 24.03:
>
> Duration: 00:00:36.08, start: 0.000000, bitrate: 178309 kb/s
> Stream #0:0(eng): Video: dnxhd (DNXHD) (AVdn /
> 0x6E645641), yuv422p10le(tv, bt709/unknown/unknown),
> 1920x1080, 176160 kb/s, SAR 1:1 DAR 16:9, 24 fps, 24 tbr,
> 23976 tbn, 23976 tbc (default)
>
> Duration: 00:00:36.10, start: 0.000000, bitrate: 116072 kb/s
> Stream #0:0: Video: dnxhd (DNXHD) (AVdn / 0x6E645641),
> yuv422p(tv, bt709/unknown/unknown), 1920x1080, 116526 kb/s,
> SAR 1:1 DAR 16:9, 24.03 fps, 24 tbr, 12288 tbn, 12288 tbc
> (default)
>
> You'll notice that there is a slight change in the duration as
> well, but this happens with the ffmpeg conversion with the cli
> as well.
>
> Let me know if you need more information and thanks for the help!
>
>
> On Tue, Nov 5, 2019 at 3:42 AM Carl Eugen Hoyos
> <ceffmpeg at gmail.com <mailto:ceffmpeg at gmail.com>> wrote:
>
> Am Di., 5. Nov. 2019 um 00:16 Uhr schrieb Vassilis
> <bpantazhs at gmail.com <mailto:bpantazhs at gmail.com>>:
> > I am trying simply to perform a transcoding process
> using the transcoding.c example from doc/examples. However
> I am seeing a very strange result (even when the example
> is not modified at all, ie not even changing codecs); the
> transcoded file has a marginally different frame rate than
> the original file. For example for a frame rate of 24 fps
> I get 24.14 fps. I also implemented this with the newer
> av_send/receive packet/frame functions to no avail. I
> would be most grateful for any insights, I've spent quite
> some time trying to troubleshoot this.
>
> Can you reproduce the issue with the ffmpeg cli or only
> with transcoding.c?
>
> Why do you think that the output frame rate is 24.14? What
> does ffmpeg
> -i show for your input file?
>
> Carl Eugen
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org
> <mailto:libav-user-request at ffmpeg.org> with subject
> "unsubscribe".
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org
> <mailto:libav-user-request at ffmpeg.org> with subject "unsubscribe".
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org
> <mailto:libav-user-request at ffmpeg.org> with subject "unsubscribe".
>
>
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20191105/a1c029a2/attachment.html>
More information about the Libav-user
mailing list