Учебное пособие для начинающих, чтобы узнать, как обрезать и обрезать видео на Android с помощью FFmpeg.

Обрезка и обрезка видео — общеизвестно сложная задача для Android. Одним из способов реализации этой функции является использование FFmpeg, бесплатного набора инструментов с открытым исходным кодом, которые могут выполнять широкий спектр задач, от преобразования видео до редактирования. Обычно FFmpeg используется из командной строки, чтобы правильно использовать его в Android, вы должны понимать его базовые API и то, как их использовать.
В этом уроке вы узнаете, как обрезать видео на Android с помощью FFmpeg. Даже если вы новичок, вы должны быть в состоянии выполнить шаги для достижения желаемых результатов.
Я пытаюсь обобщить самые важные основы, которые вам нужно знать, чтобы манипулировать видео с помощью FFmpeg. После прочтения этой статьи вы сможете использовать ее в своих приложениях. Кроме того, я разработал пример приложения и библиотеки, которые можно использовать для обрезки видео на устройстве Android.
Что такое FFmpeg
FFmpeg — отличная мультимедийная платформа, способная мультиплексировать, демультиплексировать, декодировать, кодировать, транскодировать. , фильтровать, транслировать и воспроизводить большинство существующих мультимедийных материалов. FFmpeg поддерживает различные инструменты, которые можно использовать для разработки приложения для манипулирования любым типом мультимедиа для получения желаемого результата. У вас нет никаких ограничений на то, что делать с мультимедиа при использовании FFmpeg.
К сожалению, чтобы использовать FFmpeg в Android-приложении с использованием Kotlin, вам нужно скомпилировать и собрать библиотеки, чтобы использовать их в качестве зависимости в вашем проекте. Этот процесс не прост, потому что вам нужно вручную скомпилировать библиотеку C/C++ с помощью Android NDK.
К счастью, многие люди уже сделали это, и мы можем использовать их скомпилированную библиотеку в нашем проекте. Однако, если вы хотите скомпилировать FFmpeg с нуля, вы можете это сделать. Вся необходимая информация должна быть доступна в документации для разработчиков Android.
Чтобы показать вам, как мы можем использовать FFmpeg в нашем приложении, я буду использовать скомпилированную библиотеку FFmpeg, которую можно найти здесь: https://github.com/WritingMinds/ffmpeg-android-java. Чтобы найти другие библиотеки FFmpeg, вы можете заглянуть на официальную вики FFmpeg, где перечислены несколько предварительно упакованных источников.
Настройка проекта
Чтобы использовать библиотеку FFmpeg для WritingMinds (или любую другую библиотеку), нам нужно выполнить несколько простых шагов.
1. Добавьте зависимость для библиотеки FFmpeg в файл build.gradle на уровне приложения.
2. Проверьте, поддерживает ли ваше устройство текущую реализацию FFmpeg или нет.
3. Инициализируйте модуль FFmpeg (оставьте команду пустой)
4. Реализуйте команды, которые вы хотите использовать в своем приложении.
Все команды, поддерживаемые FFmpeg, могут быть включены в ваше приложение с помощью массива. Это делается путем передачи каждого аргумента командной строки как отдельного элемента в массиве. Затем массив будет преобразован в команду FFmpeg с использованием метода execute из FFmpeg: ffmpeg.execute(command, object : ExecuteBinaryResponseHandler() { ... }
Поскольку мы хотим реализовать Trim и Crop, я покажу, как это можно сделать с помощью функции arrayOf.
Обрезать:
- «-y»: перезаписывает выходные файлы без запроса
- «-i»: указывает входной файл
- ввод: путь к исходному видео для обрезки.
- "-ss": указывает, что следующее значение будет отправной точкой результирующего видео.
- startPos: начальная позиция в формате «%d:%02d:%02d».
- "-to": указывает, что следующим значением будет конечная позиция результирующего видео.
- endPos: конечная позиция в формате «%d:%02d:%02d».
- “-c” И “copy”: указывает, что поток не будет кодироваться. Полученное видео будет только сохранено.
- output: путь к результирующему видео.
Чтобы лучше понять каждый аргумент, вы можете взглянуть на официальную документацию FFmpeg.
Кроме того, чтобы предоставить аргументы для startPos и endPos, вам обычно придется использовать служебную функцию, которая преобразует временную метку начальной и конечной позиции в желаемый формат '%d:%02d:%02d' (строка):
Обрезать:
- «-i»: указывает входной файл
- ввод: путь к исходному видео для обрезки.
- "-filter:v": указывает, что используется график фильтров.
- "crop=$w:$h:$x:$y": используйте функцию обрезки, чтобы обрезать часть видео, начиная с точки x:y и имеющую ширину (w) и высоту (h). ).
- "-threads": указывает, что следующее значение будет устанавливать количество потоков
- "5": количество используемых потоков.
- "-preset": указывает, что следующее значение будет устанавливать предустановку кодирования.
- «сверхбыстрый»: предустановка кодирования для использования.
- "-strict": указывает, насколько строго должны соблюдаться стандарты.
- "-2": строгое значение
- «-c:a» И «copy»: определяет, что поток не будет кодироваться и будут использоваться ВСЕ аудиопотоки.
- output: путь к результирующему видео.
Кроме того, проверьте официальную документацию FFmpeg, чтобы лучше понять каждый аргумент.
5. Реализуйте пользовательский интерфейс
Чтобы создать красивый пользовательский интерфейс, вы должны создать собственное представление, которое показывает некоторые кадры, доступные в видео (VideoPreviewView). Кроме того, он должен содержать SeekBar для обрезки и RangeSeekBar для обрезки. SeekBar будет использоваться для переключения на определенную метку времени в видео, чтобы увидеть, что на самом деле обрезано или обрезано. RangeSeekBar будет использоваться только в пользовательском интерфейсе обрезки для определения начальной и конечной позиции результирующего видео.
В то время как SeekBar является виджетом Android, RangeSeekBar более сложен, но существует несколько реализаций, которые можно использовать: от Tiszideepan, от HemendraGangwar.
Вы можете легко реализовать VideoPreviewView. Разделите видео на определенное количество кадров в зависимости от ширины представления и последовательно отображайте каждый кадр в одном представлении для предварительного просмотра. Для этого нужна ширина просмотра и продолжительность видео, которые можно узнать с помощью MediaMetadataRetriever. С помощью MediaMetadataRetriever вы можете использовать getFrameAtTime() для получения одного кадра с определенной отметкой времени. Если теперь вы хотите отобразить полный предварительный просмотр видео, вам нужно отобразить viewWidth / frameWidth кадров. К сожалению, в зависимости от длины и ширины видео может случиться так, что в VideoPreviewView будет присутствовать только несколько кадров. Чтобы решить эту проблему, вы должны поддерживать пороговое значение, чтобы гарантировать отображение определенного количества кадров. Это означает, что вы должны обрезать кадры до определенной ширины, пока рассчитанные кадры не будут равны порогу.
Следующий фрагмент кода покажет, как этого можно добиться:
Кроме того, для обрезки видео необходимо отобразить прямоугольник обрезки в пользовательском интерфейсе, чтобы пользователи могли решить, какую часть видео они хотят обрезать. Кроме того, вы должны дать пользователям возможность изменять положение области кадрирования. Для этого вы можете использовать библиотеку ImageCropper от ArthurHub, которая изначально предназначена для обрезки изображения, но также может использоваться для видео, так как вам нужны только значения из прямоугольника. Добавьте ImageCropper в свой проект:
Теперь вы можете расширить CropperActivity, который загружает текущий кадр видео (который вы можете извлечь с помощью VideoPreviewView), вставив макет CropImageView, чтобы получить границы обрезки. Как только вы выберете область в пользовательском интерфейсе, значения прямоугольника могут быть извлечены и использованы для расчета необходимых значений для обрезки видео с помощью этой функции:
Эти значения затем будут использоваться в качестве входных переменных для команды урожая FFmpeg.
Чтобы помочь вам использовать всю эту информацию, я создал проект, который использует все объясненные фрагменты для создания примера приложения, которое может обрезать и обрезать видео. Исходный код можно найти на моем личном GitHub.
Исправление ошибки = 13, Отказано в доступе
К сожалению, если вы реализуете описанную функциональность и используете скомпилированную библиотеку FFmpeg, вы столкнетесь с этой проблемой, если будете компилировать свое приложение для SDK 29 и выше.

Проблема вызвана тем, что, начиная с Android Q, не разрешено выполнять двоичные файлы в каталоге личных данных вашего приложения. Ошибка описана в официальном баг-трекере от google.
Одним из решений будет компиляция вашего приложения для SDK 28, но это может привести к проблемам, если вы попытаетесь разместить свое приложение в магазине Android Play.
Другое решение будет состоять в том, что вы скомпилируете свое приложение для SDK 29 и перестанете размещать двоичные файлы в любом неподдерживаемом каталоге. К сожалению, код, который перемещает двоичные файлы, находится в сторонней библиотеке от WritingMinds и должен быть удален вами (с помощью запроса на включение) или сопровождающим библиотеки. Перспективным решением будет отказ от использования внешних двоичных файлов и начало компиляции зависимостей в качестве проекта NDK. Это будет много работы, но вы можете найти помощь в известном репозитории, который компилирует CPP в Java, а также имеет FFmpeg: https://github.com/bytedeco/javacpp-presets/tree/master/ffmpeg
Добавить больше команд
После того, как вы внедрили обрезку и обрезку, вы, возможно, захотите добавить больше интересных функций в свое приложение для Android. Чтобы сделать это с помощью FFmpeg и ранее описанного кода, вы можете сделать это, просто создав новую функцию в VideoCommands() и переведя команду FFmpeg в функцию VideoCommands().
В следующих разделах будут описаны некоторые необычные функции, которые повысят удобство использования вашего приложения. Просто добавьте новую функцию с помощью этой команды и заполните обратные вызовы тостом или чем-то еще. Затем вызовите функцию из любого места вашего приложения (поскольку для этого вам не нужен пользовательский интерфейс).
Удаление звука из видео
Вы можете столкнуться со сценарием, в котором вы хотите сохранить только визуальные эффекты видео и удалить звуковую дорожку, например, для озвучивания определенных кадров или удаления фонового шума:
Сжать видео
Уменьшайте размер больших видео, чтобы сэкономить ценные дисковые ресурсы.
$w и $h — новые размеры (должны быть меньше). Если один из них равен -1, он сохранит соотношение и будет автоматически корректироваться по отношению к другому.
Изменить скорость воспроизведения
Увеличьте скорость воспроизведения, чтобы сделать длинные видео быстрее, или уменьшите ее, чтобы очень медленно показывать что-то действительно потрясающее.
$scale должен быть равен › 1 для замедления видео или ‹ 1 для ускорения видео.
Более
Чтобы найти больше интересных команд, найдите официальную документацию по аргументам и реализуйте их, помещая каждый аргумент в значение функции массива, как описано ранее.
Заключительные примечания
Из этой статьи вы узнали, что можете использовать FFmpeg для обрезки и обрезки видео на Android. К сожалению, она не работает из коробки и приходится компилировать библиотеку сложными методами. К счастью, существуют полезные библиотеки, которые сделают всю тяжелую работу за вас.
Используя мое приложение в качестве основы, вы можете обрезать видео. Кроме того, вы можете легко реализовать больше команд, если им не нужен графический интерфейс, потому что создание красивого графического интерфейса было сложной частью разработки приложения для обрезки и обрезки.
К сожалению, есть проблемы с библиотекой, которая использовалась, потому что Android Q представляет исправление безопасности, которое запрещает приложениям выполнять двоичные файлы в своей папке данных. Но это проблема только в том случае, если вы хотите создать готовое приложение Google Play Store, потому что вы можете избежать этой проблемы, если скомпилируете свое приложение для SDK 28 (и ниже). Имейте в виду, что если вы хотите создать частное приложение, которое вы распространяете на своем веб-сайте вместо использования Play Store, вы можете сделать это. Но если вы хотите загрузить свое приложение в Google Play Store, вам нужно найти другую библиотеку FFmpeg в документации или создать ее с нуля, чтобы вы могли скомпилировать свое приложение для текущего необходимого SDK.
Надеюсь, вам понравилось читать эту статью, и вы сможете создать приложение для Android, которое сможет обрезать и обрезать видео. Если у вас есть какие-либо вопросы, вам нужна помощь или вы хотите оставить отзыв, рассмотрите возможность комментирования в разделе комментариев. Я был бы рад помочь.
Не стесняйтесь связаться со мной в моем личном блоге, LinkedIn, Twitter и GitHub.