Ffmpeg warning: “Timestamps are unset in a packet” when converting H264 to mp4

ffmpegh.264videovideo conversion

I am getting the following warning message when executing ffmpeg:

[mp4 @ 00000000025c00a0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[mp4 @ 00000000025c00a0] pts has no value

The message appears when converting H264 elementary stream into mp4 video file.

I am using ffmpeg version: ffmpeg-3.3.2-win64

I tried executing the following code, to check if it's a problem in my H264 stream:

ffmpeg -f lavfi -i testsrc -t 3 -r 10 -pix_fmt yuv420p -c:v libx264 test.264
ffmpeg -r 10 -i test.264 -vcodec copy test.mp4

The code creates H264 synthetic video stream using ffmpeg, and then converts the stream into mp4.

Since the stream is created by ffmpeg, there is no reason for it not to contain required Timestamps.

Is it a bug in ffmpeg?
Is there some king of flag I missed when creating the synthetic H264 stream?
Does H264 elementary supposed to contain Timestamps?

Best Answer

  • Since the stream is created by ffmpeg, there is no reason for it not to contain required Timestamps.

    Except that raw H.264 bitstreams do not have timestamps.

    This change was introduced a while ago, and according to what I see, it simply doesn't consider the use case of muxing elementary streams that cannot have timestamps.

    This works:

    MP4Box -add test.264 -fps 10 test-out.mp4
    

    My thinking was that specifying input framerate (-r ... -i ...) would be sufficient to make that error disappear, since it is supposed to generate timestamps, but apparently it does not help in this case. It might be a bug, but I may be missing something more obscure.

    An alternative was suggested by Eugen Rieck in a comment below:

    ffmpeg -i test.264 -c copy test.avi
    ffmpeg -i test.avi -c copy test.mp4