Ffmpeg concat demuxer shifts video stream start time

[亡魂溺海] 提交于 2021-02-10 17:53:03

问题


Summary

Ffmpeg concat demuxer shifts video stream start time when invoked with -c copy option.

Reproduction

Given an before.mp4 containing video and audio streams both with start_time=0 and start_pts=0.

Given concat demuxer input file concat.txt with contents:

file before.mp4

Run command ffmpeg -f concat -i concat.txt -c copy concat.mp4

Run command ffprobe concat.mp4 -show_streams and observe that video stream start_time and start_pts are now non-zero (in my tests, the magnitude of this shift is small, on the scale of 0 -> 0.022969).

This causes the processed video, when opened using QuickTime player on Mac, to initially display a blank frame, although the rest of the video plays normally. In the image linked below, the left is what we see when first opening before.mp4; the right is what we see when first opening concat.mp4:

https://i.stack.imgur.com/lWxgF.jpg

Note that this issue occurs when concat demuxer is used to concatenate multiple mp4 files too. I used only one file above for ease of reproduction.

I understand that this issue may be dependent on the codecs used. Therefore, I've included the ffprobe output for before.mp4 below:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'before.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
  Duration: 00:00:06.50, start: 0.000000, bitrate: 998 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1024x768 [SAR 1:1 DAR 4:3], 865 kb/s, 50 fps, 50 tbr, 12800 tbn, 100 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

What I would like to do

Invoke concat demuxer with -c copy (i.e. without reencoding) without unexpected adjustments to output video stream start time.

I have a limited understanding of audio and video codecs and containers, so any suggestions on why this issue might occur, whether or not it could be fixed by ffmpeg, or suggestions for any other workarounds would be greatly appreciated!

Workarounds I've tried

start_time and start_pts are reset to 0 when the processed video is reencoded without any filters: ffmpeg -i concat.mp4 concat_reencoded.mp4.

This issue is not present when concat demuxer is invoked without -c copy option.

However, both of the above are undesirable since reencoding degrades video quality, which I would like to avoid.

This issue is also not present if before.mp4 is remuxed to before.mkv via ffmpeg -i before.mp4 -c copy before.mkv before being processed by concat demuxer. However, this causes a slight change in fps (e.g. 30 -> 29.96) which I also haven't figured out how to avoid without reencoding.

来源:https://stackoverflow.com/questions/64277299/ffmpeg-concat-demuxer-shifts-video-stream-start-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!