Как я могу конвертировать свой вебм скринкаст в mp4?

Вопрос или проблема

В 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 для получения дополнительных сведений.

Ваши вопросы и связанные с ними ответы, которые мне были полезны в этом исследовании, включают:

Вот скрипт, который я написал для этой же проблемы, с которой я столкнулся:

Это простой bash-скрипт, который следит за директорией записи экрана и автоматически конвертирует новые записи в mp4 каждый раз, когда вы делаете запись экрана.
Вы можете добавить его в автозагрузку и получать mp4 запись экрана каждый раз, когда вы записываете экран. Полностью настраиваемый!

– Он использует библиотеки ffmpeg и inotify для конвертации файлов с параметрами качества и отображает нативные уведомления Linux о ходе и завершении конвертации файла соответственно.

Github

Просто следуйте инструкциям. Ваши отзывы будут признательны!

Вот 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 и постоянной частоты кадров, выполняйте следующие шаги.

  1. Установка FFmpeg
    Если FFmpeg ещё не установлен на вашем компьютере, вы можете установить его через терминал для Ubuntu:

    sudo apt update
    sudo apt install ffmpeg
  2. Команда конвертации
    Рассмотрим команду, которую вы можете использовать для конвертации:

    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 — наихудшее).
  3. Использование скриптов
    Вы можете создать 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. Это обеспечит высокое качество видео и совместимость с различными медиа-устройствами. Убедитесь, что вы протестировали выполненные команды на разных файлах, чтобы убедиться в их универсальности и эффективности.

Оцените материал
Добавить комментарий

Капча загружается...