Скрипт запускается из текущей директории с файлом (можно чуток подправить и брать конечно полный путь, но не в этом суть - мне и так пока нормально) и создает/калдет перекодированный файл в подпапку с именем кокека
скрипт, дописывается и некоторый "задел" можно видеть (например проверка языка аудио-дорожки получается в переменную, но язык устанвливается пока что жестко на русский.... за скрипт просьба особо не пинать - вопрос не в самом скрипте
#!/bin/bash
##-tune film \ #zerolatency — как и следует из названия, для стриминга с низкой задержкой.
#-map_metadata:g -1 #очищаем метаданные, онлайн они нам не нужны
#---кодеки
CONVERT_X264=0
CONVERT_X265=1
#---маска файлов кодирования
LIST_FILE='*.m2ts'
#--- выходной формат
OUT_FORMAT_FILE='mp4'
#--- опции запуска
FFOPT='-y -hide_banner -i'
#--- использование процессора
THREADS="-threads 16"
#---профиль кодирвоания h264
PROFILE="-profile:v high"
KADR="-r 25 -g 25"
COLOR="-color_primaries bt709 -color_trc bt709 -colorspace bt709"
SLICED="-slices 4"
TUNE="-tune film"
MAP_SET="-metadata:s:a:0 language=rus"
CODEC_AUDIO="-acodec aac"
CODEC_VIDEO_X264="libx264"
CODEC_VIDEO_HEVC="hevc"
#ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
SET_PRESET="-preset slow"
#SET_PRESET="-veryslow"
#---Функции
# Первый параметр - полный путь + имя файла на входе
# Второй параметр - полный путь к файлу на выходе (слеш на конце)
# Третий параметр - кодек конвертации
# Четвертый параметр - опции кодирования
function Convert ()
{
ffmpeg ${FFOPT} "${1}" ${4} -vcodec ${3} ${CODEC_AUDIO} -f ${OUT_FORMAT_FILE} "${2}"
}
#Проверяет наличие пути.
# В случае отсутсвия - создаст каталог
function PathValidation ()
{
if cd "`pwd`/${1}" &> /dev/null; then
cd - &> /dev/null
else
cd - &> /dev/null
mkdir "`pwd`/${1}"
fi
#echo "`pwd`/${1}/"
#return "`pwd`\/${1}\/"
}
for file in ${LIST_FILE} ; do
file_name=${file%.*}
#Получаем разрешение видео с помощью mediainfo
WIDTH=`mediainfo -f "${file}" | grep -m 1 Width | awk '{print $3}'`
HEIGHT=`mediainfo -f "${file}" | grep -m 1 Height | awk '{print $3}'`
#проверка на русский язык English
Lang=`mediainfo -f "${file}" | grep -m 1 Language | awk '{print $3}'`
INPUT="`pwd`/${file}"
if [ ${CONVERT_X264} == 1 ] ; then
(PathValidation ${CODEC_VIDEO_X264})
OUTPUT="${file_name}-${HEIGHT}_${CODEC_VIDEO_X264}.${OUT_FORMAT_FILE}"
path_to_out="`pwd`/${CODEC_VIDEO_X264}/"
code_options="${SET_PRESET} ${THREADS} ${PROFILE} ${KADR} ${COLOR} ${SLICED} ${TUNE} ${MAP_SET}"
Convert "${INPUT}" "${path_to_out}${OUTPUT}" ${CODEC_VIDEO_X264} "${code_options}"
fi
if [ ${CONVERT_X265} == 1 ] ; then
PathValidation ${CODEC_VIDEO_HEVC}
OUTPUT="${file_name}-${HEIGHT}_${CODEC_VIDEO_HEVC}.${OUT_FORMAT_FILE}"
path_to_out="`pwd`/${CODEC_VIDEO_HEVC}/"
code_options="${SET_PRESET} ${THREADS} ${KADR} ${COLOR} ${SLICED} ${MAP_SET}"
Convert "${INPUT}" "${path_to_out}""${OUTPUT}" ${CODEC_VIDEO_HEVC} "${code_options}"
fi
done
Пользователь добавил сообщение 18 Июля 2019, 05:21:01:
* у меня есть программа, но не работает. Как сделать так, чтоб заработало?
про ваш скрипт BASH никто ничего не знает. Поэтому постарайтесь предоставить максимально подробную информацию. А пока что почитайте - https://trac.ffmpeg.org/wiki/Map
за ссылку спасибо,
насколько я понял, если не ошибаюсь, мне нужно добавить меппинг для указанного файла:
-map 0:0 -map 0:1 -map 0:7
и таким образом у меня должны остаться в OUT останется только то что мне нужно, а как -map 0:7(субтитрам) назначить сохранение в отдельный файл.
раньше (лет несколько назад) я вроде как для таких целей вроде как какие-то алиесы для каналов вывода делал и по этим алиесам сохранял, но найти не могу и давно это было
Пользователь добавил сообщение 18 Июля 2019, 05:33:33:
не нашел по поводу алиесов, но в принципе, то что мне нужно указано в предложенной доке начиная с примера 5, т.е. взять 0 и 1 стримы - указать опции конвертирования для них и указать выходной файл, далее мэппинго для субтитров 7 стрима - опции конвертирования и аналогично для него выходной файл... чуть позже закончится текущая порация конвертации на серве - проверю и готовую команду выложу, если все ок
Пользователь добавил сообщение 18 Июля 2019, 05:38:30:
PS
собственно если поток видео в файле 1 - то указанным скриптов выше - можно номер стрима для него определить, чтобы переменной поставить в ffmpeg аналогично и субтитры, а вот для звука прийдется все же указывать как-то... или брать первую попавшуюся дорожку или жестко задавать - для текущего файла - 1-3 это русские озвучки, остальные на других языках, но в m2ts эта инфа не записана
да и не факт, что указание языка в исходном файле правильное -именно потому у меня в скрипте ставится принудительно русский для дорожки звука
Пользователь добавил сообщение 18 Июля 2019, 06:44:27:
рано обрадовался
и все-таки
где-то ошибка:
ffmpeg -i 00000.m2ts -map 0:p:1:0 -vcodec libx264 -profile:v high -preset superfast -r 25 -g 25 -color_primaries bt709 -color_trc bt709 -colorspace bt709 -slices 4 -map 0:p:1:0:1 -acodec aac -f mp4 ./test.mp4 -map 0:p:1:0:7 ./test.sub
вывод:
ffmpeg version 4.1.3-0york1~16.04 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 20160609
configuration: --prefix=/usr --extra-version='0york1~16.04' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-nonfree --enable-libfdk-aac --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
[mpegts @ 0x55b8d06145c0] Failed to open codec in avformat_find_stream_info
[mpegts @ 0x55b8d06145c0] start time for stream 7 is not set in estimate_timings_from_pts
[mpegts @ 0x55b8d06145c0] Could not find codec parameters for stream 7 (Subtitle: hdmv_pgs_subtitle (pgssub) ([144][0][0][0] / 0x0090)): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mpegts, from '00000.m2ts':
Duration: 02:22:33.41, start: 600.000000, bitrate: 25959 kb/s
Program 1
Stream #0:0[0x1011]: Video: vc1 (Advanced) (VC-1 / 0x312D4356), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc
Stream #0:1[0x1100]: Audio: dts (DTS-HD MA) ([134][0][0][0] / 0x0086), 48000 Hz, 5.1(side), s32p (24 bit)
Stream #0:2[0x1101]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 448 kb/s
Stream #0:3[0x1102]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:4[0x1103]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 640 kb/s
Stream #0:5[0x1104]: Audio: truehd (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), s32 (24 bit)
Stream #0:6[0x1104]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 640 kb/s
Stream #0:7[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090)
File './test.mp4' already exists. Overwrite ? [y/N] y
Automatic encoder selection failed for output stream #1:0. Default encoder for format microdvd (codec none) is probably disabled. Please choose an encoder manually.
Error selecting an encoder for stream 1:0