Как заменить видеодорожку части видеофайла? - PullRequest
0 голосов
/ 16 марта 2019

У меня есть файл mp4, похожий на этот (того же формата, но длиннее):

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'N1.2.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2018-10-31T13:44:21.000000Z
  Duration: 00:28:54.21, start: 0.000000, bitrate: 10295 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 9972 kb/s, 50 fps, 50 tbr, 50k tbn, 100 tbc (default)
    Metadata:
      creation_time   : 2018-10-31T13:44:21.000000Z
      handler_name    : ?Mainconcept Video Media Handler
      encoder         : AVC Coding
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
    Metadata:
      creation_time   : 2018-10-31T13:44:21.000000Z
      handler_name    : #Mainconcept MP4 Sound Media Handler

У меня также есть другой видеофайл, который длится 3 минуты.и не имеет аудио.Какой самый быстрый способ кодировать другое видео таким образом, чтобы оно кодировалось как мое основное видео, а затем заменить последние три минуты видео дорожки моего исходного видео на это?

Другими словами.У меня есть видео, которое длится 1 час.С кодировкой, показанной выше.

У меня есть видео B длиной 3 минуты без звука.со случайным кодированием.

Я хочу иметь видео C с той же кодировкой и таким же звуком, что и у A. Но эта видеодорожка будет первые 57 минут A + B (что составляет 3 минуты).

Я хочу сделать это как можно быстрее, чтобы не перекодировать A.

Я знаю, как объединить два видео, я использую эту команду:

ffmpeg -f concat -i files.txt -c copy res.mp4

1 Ответ

1 голос
/ 18 марта 2019
  1. Завершить видео, используя параметры основного видео:

    ffmpeg -i videob.mp4 -f lavfi -i anullsrc=sample_rate=48000:channel_layout=stereo -filter_complex "[0:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p,fps=50[v]" -map "[v]" -map 1:a -c:v libx264 -profile:v main -c:a aac -video_track_timescale 50000 -shortest videob2.mp4
    
  2. Получить продолжительность основного видео:

    ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 main.mp4
    
  3. Создайте files.txt, что необходимо для дематера concat:

    file 'main.mp4'
    outpoint 3420
    file 'videob2.mp4'
    
    • В этом примере outpoint - это длительность основного видео минус длительность конечного видео.
  4. Объединить:

    ffmpeg -f concat -i files.txt -i main.mp4 -map 0:v -map 1:a -c copy -shortest output.mp4
    
...