Last active
May 7, 2023 17:49
-
-
Save palaniraja/d14ba9ac49019526e0774b28e2d71b16 to your computer and use it in GitHub Desktop.
Bash script to merge all mp4 videos in current directory (recursively 2 levels). It also updates the chapter marks to retain the folder/filename of source dir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
## Script to merge all mp4 videos in current directory (recursively 2 levels) | |
## And update chapter marks to retain the folder/filename | |
## Script for merging videos | |
filename=`basename pwd` | |
current=`pwd` | |
bname=`basename "$current"` | |
find . -maxdepth 2 -iname '*.mp4' | xargs -L 1 echo | awk '{printf "file \x27%s\x27\n", $0}' >> list.txt | |
find . -maxdepth 2 -iname '*.mp4' | xargs -L 1 echo | awk '{print $0}' >> files.txt | |
echo -n "Merging the files" | |
ffmpeg -f concat -safe 0 -i list.txt -c copy "$bname.mp4" -v quiet | |
echo "..........[ DONE ]" | |
## extract meta | |
# ffmpeg -i all.mp4 -f ffmetadata metafile | |
metafile="metadata.txt" | |
echo -n "Extracting meta data" | |
ffmpeg -i "$bname.mp4" -f ffmetadata $metafile -v quiet | |
echo "..........[ DONE ]" | |
## chapter marks | |
#TODO: (‘=’, ‘;’, ‘#’, ‘\’) to be escaped | |
ts=0 | |
echo -n "Identifying chapters" | |
cat files.txt | while read file | |
do | |
ds=`ffprobe -v quiet -of csv=p=0 -show_entries format=duration "$file"` | |
# echo "$ds" | |
echo "[CHAPTER]" >> $metafile | |
echo "TIMEBASE=1/1" >> $metafile | |
echo "START=$ts" >> $metafile | |
ts=`echo $ts + $ds | bc` | |
echo "END=$ts" >> $metafile | |
echo "TITLE=$file" >> $metafile | |
done | |
echo "..........[ DONE ]" | |
## update meta with chaptermarks | |
echo -n "Adding chapter meta " | |
ffmpeg -i "$bname.mp4" -i $metafile -map_metadata 1 -codec copy "$bname-meta.mp4" -v quiet | |
echo "..........[ DONE ]" | |
## cleanup | |
echo -n "Cleaning up" | |
rm files.txt list.txt $metafile | |
echo "..........[ DONE ]" | |
echo "Job Completed." |
Yeah, it is not good that you store the merged file twice: at line 14 without metadata, and at line 46 with metadata.
It is better to make the metadata first, and then do merge and inject metadata in one time. The @bdurrow fork does this.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I redid this in Python to better handle some unusual whitespace in my filenames (the
xargs -L1 echo
trick really does not play nice with more than 1 space at a time). Note that this hardcodes the temp file paths/will not work if run in parallel.