|
|||||||
Как перекодировать видео из формата *.MTS с 50FPS interlace в FFMpeg и другие преобразования
Время создания: 17.12.2017 12:02
Текстовые метки: ffmpeg, mts, sony, handycam, видео, 50 fps, interlace, интерлейс, кодировка, перекодирование, опции, параметры
Раздел: Компьютер - Linux - Видео в Linux - FFmpeg
Запись: xintrea/mytetra_syncro/master/base/1513501323mg7jrrj24w/text.html на raw.github.com
|
|||||||
|
|||||||
Исходный файл input.mts имеет частоту кадров равную 50 с чересстрочной разверткой. Для начала удалим чересстрочную развертку понизив частоту кадров до 25, а видео переведем в формат rawvideo, чтобы дальнейшая обработка не сказалась на качестве видеоматериала. Если вырезать из видео кусок не нужно, то убираем ключи -ss(время старта первого кадра видео) и -t(продолжительность). $ ffmpeg -threads 0 -i input.mts -filter:v yadif -r 25 -acodec copy -vcodec rawvideo -ss 00:00:00 -t 00:02:34 -y deinterlece.avi
Устранить тряску камеры можно при помощи фильтра vidstabdetect, но имейте ввиду, что для этого требуется относительно свежая версия ffmpeg. Её можно скачать отсюда. $ ffmpeg -threads 0 -i deinterlece.avi -vf vidstabdetect=stepsize=6:shakiness=10:accuracy=15 -acodec copy -vcodec rawvideo -y stab_vidstabdetect.avi $ ffmpeg -threads 0 -i deinterlece.avi -vf vidstabtransform -acodec copy -vcodec rawvideo -y stabilized.avi
Извлекаем оригинальную аудиодорожку в файл input.wav. $ ffmpeg -i stabilized.avi input.wav
Корректируем полученный аудиофайл в audacity и сохраняем результат в файл output.wav. Важно, чтобы файлы input.wav и output.wav были одинаковой длины. Заменяем аудиодорожку на output.wav, накладываем фильтр unsharp=5:5:0.8:3:3:0.4, а так же в начале и конце создаем плавное проявление и затемнение продолжительностью по 5 секунд (100 кадров) fade=in:0:100,fade=out:N:100, где N - это кол-во кадров в видео минус 100. $ ffmpeg -threads 0 -i stabilized.avi -i output.wav -filter_complex "[0:v]unsharp=5:5:0.8:3:3:0.4,fade=in:0:100,fade=out:1394:100" -acodec copy -vcodec rawvideo -map 1:a -map 0:v -y result.avi
Сжимаем видео. $ ffmpeg -threads 0 -i result.avi -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 256k result.mp4
Удаляем временные файлы. $ rm deinterlece.avi input.wav result.avi stab_vidstabdetect.avi stabilized.avi transforms.trf
Готовый скрипт. #!/bin/bash set -e # Работа со скриптом проходит в три этапа. # * Первый запуск скрипта. В случае успеха будет создан файл $AUDIO_EXPORT # * Ручное создание файла $AUDIO_IMPORT # * Второй запуск скрипта. В случае успеха будет создан файл $VIDEO_RESULT # Входной файл с чересстрочной разверткой VIDEO_IN="input.mts" # Целевая частота кадров равная половине от частоты кадров $VIDEO_IN. # Например, если $VIDEO_IN имеет частоту кадров 50, то нужно вписать 25 VIDEO_DEINTERLECE_FPS="25" # Выходной файл в формате mp4 (libx264) VIDEO_RESULT="result.mp4" # В этот файл будет экспортирована аудиодорожка из $VIDEO_IN AUDIO_EXPORT="original.wav" # Аудиодорожка, которая будет использована в $VIDEO_RESULT AUDIO_IMPORT="result.wav" # Если необходимо обрезать кусок видео, то впишите "true", в противном случае "false" TRIM_VIDEO="true" # Время первого кадра TRIM_ARG_SS="00:01:00" # Продолжительность TRIM_ARG_T="00:00:20" # Кол-во кадров для эффекта fade in в начале видео FADE_IN_FRAMES="100" # Кол-во кадров для эффекта fade out в конце видео FADE_OUT_FRAMES="100" # Конфигурация фильтра стабилизации видео VIDSTABDETECT_OPTIONS="stepsize=6:shakiness=10:accuracy=15" # Конфигурация фильтра unsharp (применяется после стабилизации видео) UNSHARP_OPTIONS="5:5:0.8:3:3:0.4" # Если входного файла нет, то прекращаем работу скрипта if [ ! -f "$VIDEO_IN" ]; then echo "Error: $VIDEO_IN not exits" exit -1 fi # Производим деинтерлейсинг и, если нужно, вырезаем кусок видео if [ ! -f "deinterlece.avi" ]; then if [ "$TRIM_VIDEO" = "true" ] then # Деинтерлейсинг и вырезание куска видео ffmpeg -threads 0 -i "$VIDEO_IN" -filter:v yadif -r $VIDEO_DEINTERLECE_FPS -acodec copy -vcodec rawvideo -ss $TRIM_ARG_SS -t $TRIM_ARG_T -y deinterlece.avi else # Просто деинтерлейсинг ffmpeg -threads 0 -i "$VIDEO_IN" -filter:v yadif -r $VIDEO_DEINTERLECE_FPS -acodec copy -vcodec rawvideo -y deinterlece.avi fi fi # Расчет таблицы для стабилизации видео if [ ! -f "stab_vidstabdetect.avi" ]; then ffmpeg -threads 0 -i deinterlece.avi -vf vidstabdetect=$VIDSTABDETECT_OPTIONS -acodec copy -vcodec rawvideo -y stab_vidstabdetect.avi fi # Стабилизация видео if [ ! -f "stabilized.avi" ]; then ffmpeg -threads 0 -i deinterlece.avi -vf vidstabtransform -acodec copy -vcodec rawvideo -y stabilized.avi fi # Извлечение аудиодорожки из исходного видео if [ ! -f "$AUDIO_EXPORT" ]; then ffmpeg -i stabilized.avi "$AUDIO_EXPORT" fi # Если аудиодорожка для замены не создана, то завершаем работу скрипта if [ ! -f "$AUDIO_IMPORT" ]; then echo "Error: $AUDIO_IMPORT not exits"; exit -1 fi # Создаем итоговое видео if [ ! -f "result.avi" ]; then # Узнаем кол-во кадров в видеофайле TOTAL_FRAMES=`exiftool stabilized.avi | grep "Total Frame Count" | grep -oE "[^:]+$" | tr -d '[[:space:]]'` # Вычитаем длину эффекта fade out TOTAL_FRAMES=`expr $TOTAL_FRAMES - $FADE_OUT_FRAMES` # Создаем итоговое видео ffmpeg -threads 0 -i stabilized.avi -i "$AUDIO_IMPORT" -filter_complex "[0:v]unsharp=$UNSHARP_OPTIONS,fade=in:0:$FADE_IN_FRAMES,fade=out:$TOTAL_FRAMES:$FADE_OUT_FRAMES" -acodec copy -vcodec rawvideo -map 1:a -map 0:v -y result.avi fi # Конвертируем из rawvideo в libx264 if [ ! -f "$VIDEO_RESULT" ]; then ffmpeg -threads 0 -i result.avi -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 256k "$VIDEO_RESULT" fi # Удаляем временные файлы rm deinterlece.avi "$AUDIO_EXPORT" result.avi stab_vidstabdetect.avi stabilized.avi transforms.trf |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|