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 <[email protected]
<mailto:[email protected]>> 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 <[email protected]
<mailto:[email protected]>> 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
<[email protected] <mailto:[email protected]>> wrote:
Am Di., 5. Nov. 2019 um 00:16 Uhr schrieb Vassilis
<[email protected] <mailto:[email protected]>>:
> 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
[email protected] <mailto:[email protected]>
https://ffmpeg.org/mailman/listinfo/libav-user
To unsubscribe, visit link above, or email
[email protected]
<mailto:[email protected]> with subject
"unsubscribe".
_______________________________________________
Libav-user mailing list
[email protected] <mailto:[email protected]>
https://ffmpeg.org/mailman/listinfo/libav-user
To unsubscribe, visit link above, or email
[email protected]
<mailto:[email protected]> with subject "unsubscribe".
_______________________________________________
Libav-user mailing list
[email protected] <mailto:[email protected]>
https://ffmpeg.org/mailman/listinfo/libav-user
To unsubscribe, visit link above, or email
[email protected]
<mailto:[email protected]> with subject "unsubscribe".
_______________________________________________
Libav-user mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/libav-user
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".
_______________________________________________
Libav-user mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/libav-user
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".