Скрипт типа должен быть универсальным, то есть поддержка различных контейнеров (матрешка, avi, mpeg, mpeg-ps, mpeg-ts, mp4, flv, 3gp), видео (x264, mpeg4 (divx 4/5), xvid, mpeg2, theora, h263) и аудио (mp2, mp3, ac3, ogg vorbis, aac, flac, ape, dts, pcm, amr) кодеков. Видео при этом должно быть высокого качества, внезависимости от расширения
Собственно говоря засунуть контент в MKV, PS, TS достаточно легко. Спасибо пакетам MKVMerge и TSMuxer.
Осталось разобраться с avi, mp4, flv, 3gp.
Скрипт пишу в обратную сторону. То есть сначала хочу сделать функциональность скрипта, а уж потом вылизывать параметры кодирования.
Столкнулся с проблемами.
1. Не нашел параметры для lavc в частности кодеков flac, ogg, dts (если lavc поддерживает кодирование в dts, конечно). В прочем интересуют все опции, включая видео.
2. Не нашел консольного ПО для конвертирование субтитров (в отдельных файлах) между форматами . Ну ладно извлечь в vobsub из DVD-Video, Матрешки смогу, Но нужен конвертер в srt.
3. Глючит mplayer. Почему-то он убежден, что любая аудиодорожка у меня двухканальная, хотя воспроизводит как бы все 6 нормально. При этом smplayer нормально выдает информацию о каналах аудиодорожки.
Собственно тут и нужна помощь!
Собственно приведу скрипт:
Код:
#!/bin/sh
INPUT_FILE=""
OUTPUT_FILE=""
TEMP_DIR=~/tmp/convert # Путь к временным файлам
VBITRATE=1000 # Битрейт видео
ABITRATE=256 # Битрейт аудио
OUTPUT_VCODEC=h264 # Видеокодек в выходном файле
OUTPUT_ACODEC=aac # Аудиокодек в выходном файле
OUTPUT_SCODEC=srt # Субтитры в выходном файле
AUDIOTRAC=1 # aid дорожки
SUBTTRAC=1 # pid дорожки
INPUT_COUNT=MKV # Входной контейнер
NUMBER_OF_ATRACK=2 # Номер извлекаемой дорожки с аудио, если входной контейнер Матрешка
NUMBER_OF_STRACK=3 # Номер извлекаемой дорожки с субтитрами, если входной контейнер Матрешка
TYPE_OF_ATRACK=ac3 # Тип аудиодорожки при простом извлечении
TYPE_OF_STRACK=srt # Тип субтитров при простом извлечении
ACODEC_COPY=yes # yes/no # Просто извлечь дорожку?
TEMP_FILES="$TEMP_DIR/temp"
mkdir $TEMP_DIR
mencoder -vf harddup,crop=640:480:0:0,scale=640:480,hqdn3d=2:1:2 -sws 10 -aspect 1.3333 -of rawvideo -o $TEMP_FILES.$OUTPUT_VCODEC \
-nosound -ovc x264 -x264encopts bitrate=$VBITRATE:pass=1:threads=auto:bframes=3:8x8dct:direct_pred=auto:me=hex:subq=
8:b_adapt=2:turbo=2:frameref=8:\
deblock=-1,-1:weight_b:trellis=2:mixed_refs:keyint_min=25:level=5.1:vbv_maxrate=6000:vbv_buf
size=6000:ratetol=1 $INPUT_FILE -nosound
mencoder -vf harddup,crop=640:480:0:0,scale=640:480,hqdn3d=2:1:2 -sws 10 -aspect 1.3333 -of rawvideo -o $TEMP_FILES.$OUTPUT_VCODEC \
-nosound -ovc x264 -x264encopts bitrate=$VBITRATE:pass=2:threads=auto:bframes=3:partitions=i4x4,i8x8,p8x8,b8x8:8x8dc
t:direct_pred=auto:me=hex:subq=8:\
b_adapt=2:turbo=2:frameref=8:deblock=-1,-1:weight_b:trellis=2:mixed_refs:keyint_min=25:level=5.1:vbv_maxrate=6000:vbv_buf
size=6000:ratetol=1:qblur=0.5 $INPUT_FILE
if [ "$ACODEC_COPY" = "no" ];
then
case "$OUTPUT_ACODEC" in
mp3) mencoder -mc 0 -noskip -aid 1 $INPUT_FILE -ovc frameno -demuxer lavf -oac mp3lame -aid $AUDIOTRAC -lameopts abr:br=$ABITRATE \
channels=2 -af volnorm=2 -of rawaudio -o $TEMP_FILES-pid$AUDIOTRAC.$OUTPUT_ACODEC;;
aac) mencoder -mc 0 -noskip -aid 1 $INPUT_FILE -ovc frameno -demuxer lavf -oac faac -aid $AUDIOTRAC -faacopts br=$ABITRATE:mpeg=4:tns:object=2 \
-channels 6 -af volnorm=2 -of rawaudio -o $TEMP_FILES-pid$AUDIOTRAC.$OUTPUT_ACODEC;;
ac3) mencoder -mc 0 -noskip -aid 1 $INPUT_FILE -ovc frameno -demuxer lavf -oac lavc -aid $AUDIOTRAC -lavcopts acodec=ac3:abitrate=384 \
-channels 6 -af volnorm=2 -of rawaudio -o $TEMP_FILES-pid$AUDIOTRAC.$OUTPUT_ACODEC;;
esac
else
if [ "$INPUT_COUNT" = "MKV" ];
then
mkvextract tracks $INPUT_FILE $NUMBER_OF_ATRACK:$TEMP_FILES-pid$AUDIOTRAC.ac3
else
mencoder -mc 0 -noskip -aid 1 $INPUT_FILE -ovc frameno -demuxer lavf -oac copy -aid $AUDIOTRAC -af volnorm=2 -of rawaudio \
-o audiox264-pid.$OUTPUT_ACODEC
fi
fi
if [ "$INPUT_COUNT" = "MKV" ];
then
mkvextract tracks $INPUT_FILE $NUMBER_OF_STRACK:$TEMP_FILES-str.srt
fi
mkvmerge -o $OUTPUT_FILE --default-duration 0:30.000fps --aspect-ratio -1:1.3333 $TEMP_FILES.$OUTPUT_VCODEC $TEMP_FILES-pid.$OUTPUT_ACODEC \
$TEMP_FILES-pid.str
rm -rf $TEMP_DIR/*
rm -rf $TEMP_DIR
exit 0