Вопрос или проблема
В Gnome есть встроенный инструмент для записи экрана, который можно использовать с ctrl
плюс shift
плюс alt
плюс R
. Это отличное средство с постоянным качеством видео!
Но мне нужен выходной файл в формате mp4. Я пытался сделать это: ffmpeg -i screencast.webm -crf 0 screencast.mp4
, как указано в других постах на AskUbuntu, но это не работает хорошо для меня, хотя предполагается, что это без потерь.
Моя запись экрана в mp4 скачет, зависает на одном кадре, и размеры файлов сильно отличаются.
Мне нужен h.264 mp4, желательно с постоянной частотой кадров, в высоком разрешении.
Какую команду ffmpeg я могу использовать?
Вот пример команды: ffmpeg -i input.webm
$ ffmpeg -i Screencast\ от\ 03-18-2023\ 04\:57\:59\ PM.webm
версия ffmpeg 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 разработчики FFmpeg
собран с помощью gcc 11 (Ubuntu 11.2.0-19ubuntu1)
конфигурация: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --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-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
ПРЕДУПРЕЖДЕНИЕ: несоответствие конфигурации библиотеки
avcodec конфигурация: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --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-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libaribb24 --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc --enable-libsmbclient
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Входной файл #0, matroska,webm, из 'Screencast from 03-18-2023 04:57:59 PM.webm':
Метаданные:
кодировщик : GStreamer matroskamux версия 1.20.3
время создания : 2023-03-18T20:57:59.129336Z
Продолжительность: 00:16:48.47, начало: 0.028000, битрейт: 858 кбит/с
Поток #0:0(eng): Видео: vp8, yuv420p(tv, bt709, progressive), 1920x1080, SAR 1:1 DAR 16:9, 1k tbr, 1k tbn, 1k tbc (по умолчанию)
Метаданные:
заголовок : Видео
Должен быть указан хотя бы один выходной файл
Это работает для вывода вашей записи экрана в mp4
, которая воспроизводится как ожидается в VLC и других плеерах:
ffmpeg -i screencast.webm -filter:v "fps=30" screencast.mp4
Это работает в большем количестве случаев и избегает ошибок ffmpeg
“не делится на 2”:
ffmpeg -i screencast.webm -filter:v "scale=trunc(iw/2)*2:trunc(ih/2)*2,fps=30" screencast.mp4
Вышеупомянутое устанавливает постоянную частоту кадров в 30 кадров в секунду (fps
). Оно изменяет размер вашего видео на один пиксель максимум и гарантирует, что ваша входная ширина и высота (iw
и ih
) являются четными числами.
Вы также можете указать параметры кодека, такие как -codec:v libx264
. Ознакомьтесь с ffmpeg
‘s Video Options для получения дополнительных сведений.
Ваши вопросы и связанные с ними ответы, которые мне были полезны в этом исследовании, включают:
-
(Содержимое, которое помещает этот ответ в удобную функцию ~/.bashrc) https://gist.github.com/azeemh/de280db7ba71e1d69ed55c0e5855de50
Вот скрипт, который я написал для этой же проблемы, с которой я столкнулся:
Это простой bash-скрипт, который следит за директорией записи экрана и автоматически конвертирует новые записи в mp4
каждый раз, когда вы делаете запись экрана.
Вы можете добавить его в автозагрузку и получать mp4 запись экрана каждый раз, когда вы записываете экран. Полностью настраиваемый!
– Он использует библиотеки ffmpeg
и inotify
для конвертации файлов с параметрами качества и отображает нативные уведомления Linux о ходе и завершении конвертации файла соответственно.
Просто следуйте инструкциям. Ваши отзывы будут признательны!
Вот bash файл, который сделает это за вас. По ответу @smcanlly.
Создайте файл с названием webm2mp4.sh
#!/bin/bash
# Проверьте, был ли предоставлен файл в качестве аргумента
if [ $# -eq 0 ]; then
echo "Ошибка: Не предоставлен входной файл"
echo "Использование: $0 <input_file.webm>"
exit 1
fi
# Получите имя входного файла
input_file="$1"
# Проверьте, существует ли входной файл
if [ ! -f "$input_file" ]; then
echo "Ошибка: Файл '$input_file' не найден"
exit 1
fi
# Проверьте, имеет ли входной файл расширение .webm
if [[ "$input_file" != *.webm ]]; then
echo "Ошибка: Входной файл должен иметь расширение .webm"
exit 1
fi
# Создайте имя выходного файла, заменив .webm на .mp4
output_file="${input_file%.webm}.mp4"
# Конвертируйте файл с помощью ffmpeg
ffmpeg -i "$input_file" -filter:v "fps=30" "$output_file"
# Проверьте, была ли конвертация успешной
if [ $? -eq 0 ]; then
echo "Конвертация успешна: $input_file -> $output_file"
else
echo "Ошибка: Конвертация не удалась"
exit 1
fi
Не забудьте задать права на выполнение командой chmod +x ./webm2mp4.sh
Затем чтобы использовать, просто запустите webm2mp4.sh some-video.webm
Ответ или решение
Конвертация видеозаписей из формата WebM в MP4 – это распространенная задача для пользователей, желающих улучшить совместимость своих видео с различными медиа-плеерами. Использование инструмента FFmpeg позволяет эффективно выполнить эту задачу, получая высококачественный выходной файл.
Почему MP4?
MP4 — это один из самых популярных форматов видео, который поддерживается почти всеми плеерами и устройствами. В то время как WebM в основном используется в веб-технологиях, MP4 идеально подходит для хранения и воспроизведения видео на различных платформах.
Проблемы с конвертацией WebM в MP4
Как упоминается в вашем вопросе, при использовании команды ffmpeg -i screencast.webm -crf 0 screencast.mp4
возникли проблемы с перемещением, зависанием изображения и значительными различиями в размере файлов. Это связано с тем, что параметр -crf 0
предназначен для потерь в качестве – функция потерь на самом деле используется в высоком качестве, но не всегда идеально подходит для преобразования.
Рекомендации по конвертации
Для успешной конвертации вашего скринкаста в формат MP4 с использованием кодека H.264 и постоянной частоты кадров, выполняйте следующие шаги.
-
Установка FFmpeg
Если FFmpeg ещё не установлен на вашем компьютере, вы можете установить его через терминал для Ubuntu:sudo apt update sudo apt install ffmpeg
-
Команда конвертации
Рассмотрим команду, которую вы можете использовать для конвертации:ffmpeg -i screencast.webm -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2,fps=30" -codec:v libx264 -preset veryfast -crf 22 screencast.mp4
Описание параметров:
-i screencast.webm
— указывает входной файл.-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2,fps=30"
— использует фильтр для изменения размера видео и установки частоты кадров на 30 кадров в секунду. Это позволяет избежать ошибок с делимостью на 2.-codec:v libx264
— задает кодек H.264 для видео.-preset veryfast
— указывает скорость кодирования; выбор "veryfast" обеспечивает хорошее качество без долгого времени ожидания.-crf 22
— устанавливает уровень качества (параметр настраивается от 0 до 51, где 0 — это бескомпромиссное качество, а 51 — наихудшее).
-
Использование скриптов
Вы можете создать bash-скрипт для автоматизации процесса:#!/bin/bash if [ $# -eq 0 ]; then echo "Ошибка: Не передан файл для конвертации." exit 1 fi input_file="$1" output_file="${input_file%.webm}.mp4" ffmpeg -i "$input_file" -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2,fps=30" -codec:v libx264 -preset veryfast -crf 22 "$output_file" if [ $? -eq 0 ]; then echo "Конвертация завершена: $output_file" else echo "Ошибка при конвертации." exit 1 fi
Не забудьте сделать скрипт исполняемым:
chmod +x webm2mp4.sh
Заключение
Следуя вышеприведённым рекомендациям, вы сможете преобразовать ваш видеоскринкаст из формата WebM в MP4 с использованием FFmpeg. Это обеспечит высокое качество видео и совместимость с различными медиа-устройствами. Убедитесь, что вы протестировали выполненные команды на разных файлах, чтобы убедиться в их универсальности и эффективности.