Skip to content

Instantly share code, notes, and snippets.

@palaniraja
Last active May 7, 2023 17:49
  • Star 7 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
Star You must be signed in to star a gist
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
#!/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."
@Ashark
Copy link

Ashark commented May 7, 2023

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