jaybers
jaybers

Reputation: 2211

How can I concatenate these two video files that are in different formats with ffmpeg?

File s.mp4 is created from a photo and a silent audio track was added in. File r.mp4 was created using the built in video record on an android tablet.

I would like to try to match s.mp4 to r.mp4 so that they can concatenate (s then r). Right now, the time base seems off and it plays audio from the r.mp4 but never shows the video. It it always shows the video from s.mp4. I was able to match the tbn of 90k by using -video_track_timescale 90k but I did not know how to match the tbc. It is 180k on one and 59.94 on the other.

Probe for s.mp4

./ffprobe s.mp4 
ffprobe version 4.0-tessus Copyright (c) 2007-2018 the FFmpeg developers
  built with Apple LLVM version 9.1.0 (clang-902.0.39.1)
  configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 's.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.25.100
  Duration: 00:00:05.04, start: 0.000000, bitrate: 296 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 286 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 2 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Probe for r.mp4

./ffprobe r.mp4 
ffprobe version 4.0-tessus Copyright (c) 2007-2018 the FFmpeg developers
  built with Apple LLVM version 9.1.0 (clang-902.0.39.1)
  configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2018-06-11T20:12:03.000000Z
    com.android.version: 7.0
  Duration: 00:00:10.89, start: 0.000000, bitrate: 17087 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/smpte170m), 1920x1080, 16810 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      creation_time   : 2018-06-11T20:12:03.000000Z
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 256 kb/s (default)
    Metadata:
      creation_time   : 2018-06-11T20:12:03.000000Z
      handler_name    : SoundHandle

Upvotes: 0

Views: 469

Answers (1)

Gyan
Gyan

Reputation: 93329

Use this command to generate s.mp4.

ffmpeg -framerate 30 -i image -f lavfi -i anullsrc
       -c:v libx264 -profile:v high -c:a aac
       -pix_fmt yuv420p -ac 2 -ar 48000
       -color_range 1 -color_primaries 1 -colorspace 1 -color_trc 6
       -video_track_timescale 90k -t 5 s.mp4

r has a High profile H264 stream, so that should be matched. I don't know the specific encoding settings, so there's still a chance that certain properties like refcount don't match.

tbc doesn't matter for concat purposes. Neither do the color flags but I just set them for diligent players.

I would recommend that you remux both files to TS and then concat to MP4. That'll leave the main video's xPS in-band, so some players will reinit decoder even if their properties don't match perfectly.

Upvotes: 1

Related Questions