Skip to main content
added 669 characters in body
Source Link
user1844116
user1844116
ffmpeg -ss 30 -to 1010 -i part-1.mp4 -vcodec copy -an part-1-trimmed.mp4
ffmpeg -ss 32 -to 5458 -i part-2.mp4 -vcodec copy -an part-2-trimmed.mp4
ffmpeg -ss 22 -to 228 -i part-3.mp4 -vcodec copy -an part-3-trimmed.mp4
ffmpeg -ss 97 -to 3848 -i part-4.mp4 -vcodec copy -an part-4-trimmed.mp4
ffmpeg -ss 32 -to 98 -i part-5.mp4 -vcodec copy -an part-5-trimmed.mp4
ffmpeg -ss 92 -to 378 -i part-6.mp4 -vcodec copy -an part-6-trimmed.mp4
ffmpeg -ss 36 -to 5160 -i part-7.mp4 -vcodec copy -an part-7-trimmed.mp4
ffmpeg -ss 1010 -t 2 -i part-1.mp4 -ss 30 -t 2 -i part-2.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-1-2.mp4
ffmpeg -ss 5458 -t 2 -i part-2.mp4 -ss 20 -t 2 -i part-3.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-2-3.mp4
ffmpeg -ss 228 -t 2 -i part-3.mp4 -ss 95 -t 2 -i part-4.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-3-4.mp4
ffmpeg -ss 3848 -t 2 -i part-4.mp4 -ss 30 -t 2 -i part-5.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-4-5.mp4
ffmpeg -ss 98 -t 2 -i part-5.mp4 -ss 90 -t 2 -i part-6.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-5-6.mp4
ffmpeg -ss 378 -t 2 -i part-6.mp4 -ss 34 -t 2 -i part-7.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-6-7.mp4
echo -e "file 'part-1-trimmed.mp4'\nfile 'transition-1-2.mp4'\nfile 'part-2-trimmed.mp4'\nfile 'transition-2-3.mp4'\nfile 'part-3-trimmed.mp4'\nfile 'transition-3-4.mp4'\nfile 'part-4-trimmed.mp4'\nfile 'transition-4-5.mp4'\nfile 'part-5-trimmed.mp4'\nfile 'transition-5-6.mp4'\nfile 'part-6-trimmed.mp4'\nfile 'transition-6-7.mp4'\nfile 'part-7-trimmed.mp4'" > cat-files.txt
ffmpeg -f concat -i cat-files.txt -c copy final.mp4

The -x265-params profile=main -pix_fmt yuvj420p bit is to match the codec to the other source files I have, however they don't quite match:

source:

Stream #0:0[0x1](und): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 3840x1920, 50052 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)

generated transition clips:

Stream #0:0[0x1](und): Video: hevc (Main) (hev1 / 0x31766568), yuvj420p(pc, bt709, progressive), 3840x1920, 27685 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)

I'm not sure how to get rid of progressive which is the only real difference I see.

ffmpeg -ss 30 -to 1010 -i part-1.mp4 -vcodec copy -an part-1-trimmed.mp4
ffmpeg -ss 32 -to 5458 -i part-2.mp4 -vcodec copy -an part-2-trimmed.mp4
ffmpeg -ss 22 -to 228 -i part-3.mp4 -vcodec copy -an part-3-trimmed.mp4
ffmpeg -ss 97 -to 3848 -i part-4.mp4 -vcodec copy -an part-4-trimmed.mp4
ffmpeg -ss 32 -to 98 -i part-5.mp4 -vcodec copy -an part-5-trimmed.mp4
ffmpeg -ss 92 -to 378 -i part-6.mp4 -vcodec copy -an part-6-trimmed.mp4
ffmpeg -ss 36 -to 5160 -i part-7.mp4 -vcodec copy -an part-7-trimmed.mp4
ffmpeg -ss 1010 -t 2 -i part-1.mp4 -ss 30 -t 2 -i part-2.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-1-2.mp4
ffmpeg -ss 5458 -t 2 -i part-2.mp4 -ss 20 -t 2 -i part-3.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-2-3.mp4
ffmpeg -ss 228 -t 2 -i part-3.mp4 -ss 95 -t 2 -i part-4.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-3-4.mp4
ffmpeg -ss 3848 -t 2 -i part-4.mp4 -ss 30 -t 2 -i part-5.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-4-5.mp4
ffmpeg -ss 98 -t 2 -i part-5.mp4 -ss 90 -t 2 -i part-6.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-5-6.mp4
ffmpeg -ss 378 -t 2 -i part-6.mp4 -ss 34 -t 2 -i part-7.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-6-7.mp4
echo -e "file 'part-1-trimmed.mp4'\nfile 'transition-1-2.mp4'\nfile 'part-2-trimmed.mp4'\nfile 'transition-2-3.mp4'\nfile 'part-3-trimmed.mp4'\nfile 'transition-3-4.mp4'\nfile 'part-4-trimmed.mp4'\nfile 'transition-4-5.mp4'\nfile 'part-5-trimmed.mp4'\nfile 'transition-5-6.mp4'\nfile 'part-6-trimmed.mp4'\nfile 'transition-6-7.mp4'\nfile 'part-7-trimmed.mp4'" > cat-files.txt
ffmpeg -f concat -i cat-files.txt -c copy final.mp4
ffmpeg -ss 30 -to 1010 -i part-1.mp4 -vcodec copy -an part-1-trimmed.mp4
ffmpeg -ss 32 -to 5458 -i part-2.mp4 -vcodec copy -an part-2-trimmed.mp4
ffmpeg -ss 22 -to 228 -i part-3.mp4 -vcodec copy -an part-3-trimmed.mp4
ffmpeg -ss 97 -to 3848 -i part-4.mp4 -vcodec copy -an part-4-trimmed.mp4
ffmpeg -ss 32 -to 98 -i part-5.mp4 -vcodec copy -an part-5-trimmed.mp4
ffmpeg -ss 92 -to 378 -i part-6.mp4 -vcodec copy -an part-6-trimmed.mp4
ffmpeg -ss 36 -to 5160 -i part-7.mp4 -vcodec copy -an part-7-trimmed.mp4
ffmpeg -ss 1010 -t 2 -i part-1.mp4 -ss 30 -t 2 -i part-2.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-1-2.mp4
ffmpeg -ss 5458 -t 2 -i part-2.mp4 -ss 20 -t 2 -i part-3.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-2-3.mp4
ffmpeg -ss 228 -t 2 -i part-3.mp4 -ss 95 -t 2 -i part-4.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-3-4.mp4
ffmpeg -ss 3848 -t 2 -i part-4.mp4 -ss 30 -t 2 -i part-5.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-4-5.mp4
ffmpeg -ss 98 -t 2 -i part-5.mp4 -ss 90 -t 2 -i part-6.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-5-6.mp4
ffmpeg -ss 378 -t 2 -i part-6.mp4 -ss 34 -t 2 -i part-7.mp4 -c:v libx265 -x265-params profile=main -pix_fmt yuvj420p -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-6-7.mp4
echo -e "file 'part-1-trimmed.mp4'\nfile 'transition-1-2.mp4'\nfile 'part-2-trimmed.mp4'" > cat-files.txt
ffmpeg -f concat -i cat-files.txt -c copy final.mp4

The -x265-params profile=main -pix_fmt yuvj420p bit is to match the codec to the other source files I have, however they don't quite match:

source:

Stream #0:0[0x1](und): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 3840x1920, 50052 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)

generated transition clips:

Stream #0:0[0x1](und): Video: hevc (Main) (hev1 / 0x31766568), yuvj420p(pc, bt709, progressive), 3840x1920, 27685 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)

I'm not sure how to get rid of progressive which is the only real difference I see.

Source Link
user1844116
user1844116

Trying to merge ffmpeg commands into one

I initially tried doing this as one command, but after struggling with it I wrote a quick script to create a bunch of intermediate files to get the job done, but that isn't quite working either.

The goal:

  • I have a bunch of video clips
  • I want to trim the start/ends of each one, then concat them all
  • I want there to be a fade between each one
  • I don't want to re-encode the other 99.9% of each video

So I wrote a quick script to generate ffmpeg commands that create trimmed clips, then a bunch of 2 second transition clips, then merge them all together. What I end up with:

ffmpeg -ss 30 -to 1010 -i part-1.mp4 -vcodec copy -an part-1-trimmed.mp4
ffmpeg -ss 32 -to 5458 -i part-2.mp4 -vcodec copy -an part-2-trimmed.mp4
ffmpeg -ss 22 -to 228 -i part-3.mp4 -vcodec copy -an part-3-trimmed.mp4
ffmpeg -ss 97 -to 3848 -i part-4.mp4 -vcodec copy -an part-4-trimmed.mp4
ffmpeg -ss 32 -to 98 -i part-5.mp4 -vcodec copy -an part-5-trimmed.mp4
ffmpeg -ss 92 -to 378 -i part-6.mp4 -vcodec copy -an part-6-trimmed.mp4
ffmpeg -ss 36 -to 5160 -i part-7.mp4 -vcodec copy -an part-7-trimmed.mp4
ffmpeg -ss 1010 -t 2 -i part-1.mp4 -ss 30 -t 2 -i part-2.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-1-2.mp4
ffmpeg -ss 5458 -t 2 -i part-2.mp4 -ss 20 -t 2 -i part-3.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-2-3.mp4
ffmpeg -ss 228 -t 2 -i part-3.mp4 -ss 95 -t 2 -i part-4.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-3-4.mp4
ffmpeg -ss 3848 -t 2 -i part-4.mp4 -ss 30 -t 2 -i part-5.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-4-5.mp4
ffmpeg -ss 98 -t 2 -i part-5.mp4 -ss 90 -t 2 -i part-6.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-5-6.mp4
ffmpeg -ss 378 -t 2 -i part-6.mp4 -ss 34 -t 2 -i part-7.mp4 -filter_complex "[0][1]xfade=transition=fade:duration=2[output]" -an -map "[output]" transition-6-7.mp4
echo -e "file 'part-1-trimmed.mp4'\nfile 'transition-1-2.mp4'\nfile 'part-2-trimmed.mp4'\nfile 'transition-2-3.mp4'\nfile 'part-3-trimmed.mp4'\nfile 'transition-3-4.mp4'\nfile 'part-4-trimmed.mp4'\nfile 'transition-4-5.mp4'\nfile 'part-5-trimmed.mp4'\nfile 'transition-5-6.mp4'\nfile 'part-6-trimmed.mp4'\nfile 'transition-6-7.mp4'\nfile 'part-7-trimmed.mp4'" > cat-files.txt
ffmpeg -f concat -i cat-files.txt -c copy final.mp4

This generates the final video, but the fade sections are broken (video player just skips over those 2 seconds), and I get loads of these errors:

Non-monotonous DTS in output stream 0:0; previous: 29398369, current: 29398268; changing to 29398370. This may result in incorrect timestamps in the output file.

My attempt at doing this without all the intermediate files (and only with 2 clips and trimming to 1 second clips for testing):

ffmpeg -i part-1.mp4 -i part-2.mp4 \
-filter_complex "[0:v]trim=start=227:duration=1[0_middle];\
[0:v]trim=start=228:duration=1[0_end];\
[1:v]trim=start=30:duration=1[1_start];\
[1:v]trim=start=31:duration=1[1_middle];\
[0_end][1_start]xfade=transition=fade:duration=1[fade_0_1];\
[0_middle][fade_0_1][1_middle]concat=n=3[output]" \
-map "[output]" \
output.mp4

However this a) reencodes everything (If I add -vcodec copy it tells me filtering and a streamcopy can't be used together, but I can't find another way of specifying this) and b) just hangs and eventually says:

More than 1000 frames duplicated

I'd prefer to do this without all the intermediate files, but help with either method is appreciated!