| | 53 | }}} |
| | 54 | |
| | 55 | Concatenation becomes troublesome, if next file for concatenation does not exist at the beginning, because decoding won't start until the whole list is read. However, it is possible to refer another list at the end of the current list: |
| | 56 | |
| | 57 | {{{ |
| | 58 | #!/bin/bash |
| | 59 | |
| | 60 | fn_concat_init() { |
| | 61 | echo "fn_concat_init" |
| | 62 | concat_pls=`mktemp -u -p . concat.XXXXXXXXXX.txt` |
| | 63 | concat_pls="${concat_pls#./}" |
| | 64 | echo "concat_pls=${concat_pls:?}" |
| | 65 | mkfifo "${concat_pls:?}" |
| | 66 | echo |
| | 67 | } |
| | 68 | |
| | 69 | fn_concat_feed() { |
| | 70 | echo "fn_concat_feed ${1:?}" |
| | 71 | { |
| | 72 | >&2 echo "removing ${concat_pls:?}" |
| | 73 | rm "${concat_pls:?}" |
| | 74 | concat_pls= |
| | 75 | >&2 fn_concat_init |
| | 76 | echo 'ffconcat version 1.0' |
| | 77 | echo "file '${1:?}'" |
| | 78 | echo "file '${concat_pls:?}'" |
| | 79 | } >"${concat_pls:?}" |
| | 80 | echo |
| | 81 | } |
| | 82 | |
| | 83 | fn_concat_end() { |
| | 84 | echo "fn_concat_end" |
| | 85 | { |
| | 86 | >&2 echo "removing ${concat_pls:?}" |
| | 87 | rm "${concat_pls:?}" |
| | 88 | # not writing header. |
| | 89 | } >"${concat_pls:?}" |
| | 90 | echo |
| | 91 | } |
| | 92 | |
| | 93 | fn_concat_init |
| | 94 | |
| | 95 | echo "launching ffmpeg ... all.mkv" |
| | 96 | timeout 60s ffmpeg -y -re -loglevel warning -i "${concat_pls:?}" -pix_fmt yuv422p all.mkv & |
| | 97 | |
| | 98 | ffplaypid=$! |
| | 99 | |
| | 100 | |
| | 101 | echo "generating some test data..." |
| | 102 | i=0; for c in red yellow green blue; do |
| | 103 | ffmpeg -loglevel warning -y -f lavfi -i testsrc=s=720x576:r=12:d=4 -pix_fmt yuv422p -vf "drawbox=w=50:h=w:t=w:c=${c:?}" test$i.mkv |
| | 104 | fn_concat_feed test$i.mkv |
| | 105 | ((i++)); |
| | 106 | echo |
| | 107 | done |
| | 108 | echo "done" |
| | 109 | |
| | 110 | fn_concat_end |
| | 111 | |
| | 112 | wait "${ffplaypid:?}" |
| | 113 | |
| | 114 | echo "done encoding all.mkv" |