#!/bin/bashTARGETDIR="/mnt/other/MediaPool/Media/Video/tests"INFOFILE="/tmp/~ffmpeg_info.txt"DEBUG=1ffmpeg -i 00001.ts 2>$INFOFILE# collect stream types, formats and languages to demux everythingpref_lng="deu"pref_fmt="ac3"idx=0id_video_str=-1id_pref_aud=-1for key in $(cat $INFOFILE | grep 'Stream #0.' | cut -f1 -d"[" | sed "s:Stream ::"); do stream[${idx}]="$(cat $INFOFILE | grep $key)" if [[ $DEBUG = 1 ]]; then # this line only for debugging, when collecting a new parameter for example echo "${stream[$idx]}" fi str_type[${idx}]="$(echo "${stream[$idx]}" | cut -f7 -d" " | sed "s#:##")" str_pid[${idx}]="$(echo "${stream[$idx]}" | cut -f6 -d" " | cut -f2 -d "[" | cut -f1 -d "]")" str_fmt[${idx}]="$(echo "${stream[$idx]}" | cut -f8 -d" " | sed "s#,##")" if ! [[ "${str_type[$idx]}" = "Video" ]]; then str_lng[${idx}]="$(echo "${stream[$idx]}" | cut -f6 -d" " | cut -f2 -d '(' | cut -f1 -d ')')" if [[ "${str_lng[$idx]}" = "" ]]; then str_lng[${idx}]="und" fi else id_video_str=$idx fi # increment iterator index idx=$((idx+1))done# build demux command line templatedmx_cmd="ffmpeg -i \$1"function track_filename() { echo "\${1%.*}_${str_type[$1]}_${str_pid[$1]}_${str_lng[$1]}.${str_fmt[$1]}"}for idx in ${!stream[*]}; do # for debugging only: if [[ $DEBUG = 1 ]]; then echo "Found stream at index $idx: of type '${str_type[$idx]}', pid '${str_pid[$idx]}', format '${str_fmt[$idx]}', language '${str_lng[$idx]}'" fi #dmx_name_map="\${1%.*}_${str_type[$idx]}_${str_pid[$idx]}_${str_lng[$idx]}.${str_fmt[$idx]} -map 0:$idx" dmx_name_map="$(track_filename $idx) -map 0:$idx" case ${str_type[$idx]} in Video) cmdline_stream="-vcodec copy $dmx_name_map" ;; Audio) cmdline_stream="-acodec copy $dmx_name_map" ;;# Subtitle)# cmdline_stream="-scodec ${str_fmt[$idx]} \${1%.*}_${str_type[$idx]}_${str_pid[$idx]}_${str_lng[$idx]}.vob -map 0:$idx"# ;; *) cmdline_stream="" ;; esac if ! [[ "$cmdline_stream" = "" ]]; then dmx_cmd="$dmx_cmd $cmdline_stream" fidone# for debugging only:if [[ $DEBUG = 1 ]]; then echo "total number of streams: ${#stream[*]}" echo "demuxing command line: $dmx_cmd"fifunction demux_recpart() { eval $dmx_cmd}# build mkvmerge commandrm -f $TARGETDIR/output.mkvmkv_cmd="mkvmerge -o $TARGETDIR/output.mkv --language 1:ger --default-duration 0:50fps"function add_2_mkv_cmd() { local delimiter local track_count=0 if [[ "$idxmkv" = "0" ]]; then delimiter=" " mkv_trackorder="${mkv_trackorder}0:0,1:0" else delimiter=" +" if ! [[ "$idxmkv" = "1" ]]; then mkv_append="$mkv_append," fi fi for track in ${!stream[*]}; do if [[ "${str_type[$track]}" = "Video" ]]; then tracks="$delimiter$(track_filename $track)" track_count=$((track_count+1)) fi if [[ "${str_type[$track]}" = "Audio" ]] && [[ "${str_fmt[$track]}" = "ac3" ]]; then tracks="$tracks $delimiter$(track_filename $track)" track_count=$((track_count+1)) fi # increment iterator index track=$((track+1)) done # careful with this mkv_cmd="$mkv_cmd $(eval echo "${tracks}")" if ! [[ "$idxmkv" = "0" ]]; then mkv_append="$mkv_append$((idxmkv*track_count+0)):0:$((idxmkv*track_count-track_count)):0,$((idxmkv*track_count+1)):0:$((idxmkv*track_count-track_count+1)):0" fi # increment iterator index idxmkv=$((idxmkv+1))}idxmkv=0mkv_trackorder="--track-order "mkv_append=""for tsfile in $(ls [0-9][0-9][0-9][0-9][0-9].ts); do demux_recpart $tsfile add_2_mkv_cmd $tsfiledonemkv_cmd="$mkv_cmd $mkv_trackorder"if ! [[ "$mkv_append" = "" ]]; then mkv_cmd="$mkv_cmd --append-to $mkv_append"fiif [[ $DEBUG = 1 ]]; then echo "" echo "$mkv_cmd"fi$mkv_cmd