Handy little script to concatenate video files. Probably wouldn't recommend it with dissimilar files, though.
if [[ -z $1 || -z $2 ]]; then
echo "Must supply at least two arguments.";
ext=`echo $1 | sed -e "s/.*\.//"`;
ffmpeg -f concat -safe 0 \
-i <(for f in "$@"; do echo "file '$PWD/$f'"; done) \
-c copy output.$ext
Had an annoying bug that didn't seem to show up on google... so maybe this will resolve some issues.
I have a makefile where a build is attempted, but because the build tool is buggy, sometimes it fails for no reason. So I invoke it with a timeout, then test to see if it errored out, and if so I rerun the build. The error code in bash is
; but inside of a makefile the
needs to be escaped, so I write
However, if you need to stick this into a makefile
block, you need to escape the escaped
. If you don't, you'll get this error:
-ne: unary operator expected
. So you'll have to do this:
in order to escape things properly.
I had an issue where a video file had embedded (soft) subtitles with an error, and I wanted to edit the subtitles. Since it's just a stream in the file, it's really easy - at least for an mkv container.
All you need to do is extract the subtitles, edit them in your editor of choice, then add the stream back in. Previously, I removed the subtitle stream from the file entirely then added the edited one back; the updated version simply uses the video and audio from the original file, and the subtitles from the edited srt file, to make the new video output.
ffmpeg -i <video.mkv> -an -vn -map 0:2 -c:s:0 srt <sub.srt>
ffmpeg -i <video.mkv> -i sub.srt -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s copy <video_output.mkv>