Статьи

Введение в Xuggler для управления видео

Примечание. Это часть нашей серии « Учебники по разработке Xuggler ».

С появлением видео в Интернете разработчикам часто приходится манипулировать видеоконтентом в своих приложениях. Xuggler — это бесплатная библиотека с открытым исходным кодом для Java-разработчиков, которую можно использовать для распаковки, обработки и сжатия записанного или живого видео в реальном времени. Xuggler использует очень мощные библиотеки обработки мультимедиа FFmpeg под капотом, по сути играя роль java-оболочки вокруг них. Это простой способ распаковать, изменить и повторно сжать любой медиафайл (или поток) из Java.

FFmpeg — это комплексное кроссплатформенное решение для записи, преобразования и потоковой передачи аудио и видео, поддерживающее множество форматов. Вполне вероятно, что вы уже используете его на своем компьютере, даже не зная об этом. Однако использование Xuggler не ограничивается простым предоставлением простого доступа к сложным собственным библиотекам FFmpeg. Команда разработчиков Xuggler также постоянно добавляет улучшения в FFmpeg. Вы можете найти последние новости в блоге Xuggle , где также опубликован ряд руководств. Не пропустите чересчур упрощенное руководство по интернет-видео от этих ребят.

Давайте продолжим, получив FFmpeg. Обратите внимание, что Xuggler поставляется с собственной (улучшенной) версией FFmpeg, чтобы избежать проблем с неправильной настройкой, поэтому вам НЕ нужно вручную получать FFmpeg. Попутно мы собираемся протестировать некоторые вещи непосредственно с помощью FFmpeg перед передачей управления Xuggler, поэтому вы можете предпочесть иметь оригинальную версию в качестве отдельного исполняемого файла.

Перейдите на страницу загрузок FFmpeg и получите последний дистрибутив, на тот момент версии 0.6.1. Для Linux вы загружаете исходный код из архива и приступаете к компиляции. В Windows вы, вероятно, должны получить предварительно скомпилированный двоичный файл. Я использовал тот, что предоставлен Mplayer-win32, и его можно получить здесь . Там вы найдете исполняемый файл ffmpeg.exe. Скопируйте его в определенную папку, я выбрал «C: \ Programs \ ffmpeg» и, при желании, добавляю ffmpeg.exe в путь вашей системы, если вы не хотите каждый раз записывать полный путь.

Чтобы проверить, что исполняемый файл работает правильно, откройте терминал и просто запустите его без аргументов. Вы должны увидеть вывод, похожий на этот:

Версия FFmpeg SVN-r21231-Sherpya, Copyright (c) 2000-2010 Fabrice Bellard, et al.
построено 16 января 2010 05:42:31 с gcc 4.2.5 20080919 (предварительный выпуск) [Sherpya] libavutil 50. 7. 0 / 50. 7. 0
libavcodec 52.47. 0 / 52,47. 0
libavformat 52.47. 0 / 52,47. 0
libavdevice 52. 2. 0 / 52. 2.0
libavfilter 1.15. 0 / 1,15. 0
libswscale 0. 8. 0 / 0. 8. 0
libpostproc 51. 2. 0 / 51. 2.0
Гипер-быстрый аудио и видео кодер
использование: ffmpeg [параметры] [[параметры infile] -i infile]… {[параметры outfile] outfile}…

Используйте -h, чтобы получить полную помощь, или, что еще лучше, запустите ‘man ffmpeg’

Вы также можете использовать ключ «-h», как показано в выводе, чтобы получить смехотворно длинный список аргументов и опций. Лучше проверить онлайн документацию FFmpeg .

Следующим шагом будет перекодирование вашего первого видео, возможно, из предварительно записанного файла. Мой входной файл — это видео MP4, длиной 4 минуты 20 секунд, размером 18,1 МБ, которое называется «myvideo.mp4». Я хотел бы преобразовать это в Flash Video, значительно снизив его качество. Это очень просто сделать с помощью FFmpeg, введя следующую команду (обратите внимание на использование прямой косой черты для путей):

ffmpeg.exe -i C: /myvideo.mp4 C: /myvideo.flv

Вот как выглядит вывод консоли:

Версия FFmpeg SVN-r21231-Sherpya, Copyright (c) 2000-2010 Fabrice Bellard, et al.
построено 16 января 2010 05:42:31 с gcc 4.2.5 20080919 (предварительный выпуск) [Sherpya] libavutil 50. 7. 0 / 50. 7. 0
libavcodec 52.47. 0 / 52,47. 0
libavformat 52.47. 0 / 52,47. 0
libavdevice 52. 2. 0 / 52. 2.0
libavfilter 1.15. 0 / 1,15. 0
libswscale 0. 8. 0 / 0. 8. 0
libpostproc 51. 2. 0 / 51. 2.0

Кажется, частота кадров кодека потока 1 отличается от частоты кадров контейнера: 59,92 (14981/250) -> 29,96 (14981/500)
Введите # 0, mov, mp4, m4a, 3gp, 3g2, mj2 из ‘C: /myvideo.mp4’:
Метаданные:
major_brand: mp42
minor_version: 0
compatibility_brands: isomavc1mp42
Длительность: 00: 04: 20,96, старт: 0,000000, битрейт: 582 кбит / с
Поток # 0.0 (und): Аудио: aac, 44100 Гц, стерео, s16, 115 кбит / с
Поток # 0.1 (und): Видео: h264, yuv420p, 480 × 270 [PAR 1: 1 DAR 16: 9], 464 кбит / с, 29,96 к / с, 29,96 тбр, 29962 тбн, 59,92 тбк
Выведите # 0, flv, в ‘C: /myvideo.flv’:
Поток # 0.0 (und): Видео: flv, yuv420p, 480 × 270 [PAR 1: 1 DAR 16: 9], q = 2-31, 200 кбит / с, 1 тыс. Тбит, 29,96 т. Д.
Поток # 0.1 (und): Аудио: libmp3lame, 44100 Гц, стерео, s16, 64 Кбит / с
Отображение потока:
Поток № 0.1 -> # 0.0
Поток № 0.0 -> # 0.1
Нажмите [q], чтобы остановить кодирование
[libmp3lame @ 0038f3a0] lame: выходной буфер слишком мал (индекс буфера: 9404, свободных байтов: 388)
Аудио кодирование не удалось

Не обращайте внимания на сообщение «Ошибка аудиокодирования», ошибки нет. Результатом является хороший, воспроизводимый FLV-файл с именем «myvideo.flv» размером 10,1 МБ.

Круто, приступим к установке Xuggler. Сначала мы получаем последнюю версию со страницы загрузок Xuggler . Как указано там:

Xuggler состоит из двух основных компонентов; набор файлов jar Java и набор собственных общих библиотек (файлы .dll в Windows, файлы .so в Linux или файлы .dylib в Mac). Для использования вам необходимо сначала установить собственные библиотеки, а затем вы можете писать программы, использующие Xuggler.

Убедитесь, что вы загружаете правильный файл, соответствующий архитектуре вашей ОС и вашей версии Java. Например, я скачал 32-битную (не 64-битную для Windows), Java 1.5 или более позднюю версию для Windows, которая в основном является установщиком.

Вы можете найти инструкции по установке собственных библиотек на странице загрузок. Для Windows вы удалите все предыдущие версии, запустите программу установки и, конечно, перезагрузите компьютер . Также есть видео, описывающее, как установить Xuggler в Microsoft Windows . После перезагрузки давайте проверим, была ли установка успешной. Сначала мы проверяем, установлена ​​ли переменная пути Xuggle:

C: \> echo% XUGGLE_HOME%
C: \ Program Files (x86) \ Xuggle

Путь был правильно установлен. Обратите внимание, что исполняемый файл Xuggler FFmpeg находится в папке «% XUGGLE_HOME% / bin».

Давайте проиграем наше первое видео, выполнив следующую команду (замените «c: /myvideo.mp4» на ваш файл):

java -cp «% XUGGLE_HOME% \ share \ java \ jars \ xuggle-xuggler.jar» com.xuggle.xuggler.demos.DecodeAndPlayVideo c: /myvideo.mp4

Время написать наш первый код с Xuggler. Мы собираемся проверить видеофайл, выяснить его медиа-контейнер и распечатать его содержимое. Между тем, добавьте в закладки Javadocs API Xuggle для дальнейшего использования.

Запустите вашу любимую IDE, создайте новый проект и импортируйте все файлы JAR, найденные в папке «% XUGGLE_HOME% / share / java / jars». Пример аналогичен приведенному в посте « Как написать свое первое приложение Xuggler в Eclipse» .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.javacodegeeks.xuggler.intro;
 
import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IStream;
import com.xuggle.xuggler.IStreamCoder;
 
public class VideoInfo {
     
    private static final String filename = "c:/myvideo.mp4";
     
    public static void main(String[] args) {
         
        // first we create a Xuggler container object
        IContainer container = IContainer.make();
         
        // we attempt to open up the container
        int result = container.open(filename, IContainer.Type.READ, null);
         
        // check if the operation was successful
        if (result<0)
            throw new RuntimeException("Failed to open media file");
         
        // query how many streams the call to open found
        int numStreams = container.getNumStreams();
         
        // query for the total duration
        long duration = container.getDuration();
         
        // query for the file size
        long fileSize = container.getFileSize();
 
        // query for the bit rate
        long bitRate = container.getBitRate();
         
        System.out.println("Number of streams: " + numStreams);
        System.out.println("Duration (ms): " + duration);
        System.out.println("File Size (bytes): " + fileSize);
        System.out.println("Bit Rate: " + bitRate);
         
        // iterate through the streams to print their meta data
        for (int i=0; i<numStreams; i++) {
             
            // find the stream object
            IStream stream = container.getStream(i);
             
            // get the pre-configured decoder that can decode this stream;
            IStreamCoder coder = stream.getStreamCoder();
             
            System.out.println("*** Start of Stream Info ***");
             
            System.out.printf("stream %d: ", i);
            System.out.printf("type: %s; ", coder.getCodecType());
            System.out.printf("codec: %s; ", coder.getCodecID());
            System.out.printf("duration: %s; ", stream.getDuration());
            System.out.printf("start time: %s; ", container.getStartTime());
            System.out.printf("timebase: %d/%d; ",
                 stream.getTimeBase().getNumerator(),
                 stream.getTimeBase().getDenominator());
            System.out.printf("coder tb: %d/%d; ",
                 coder.getTimeBase().getNumerator(),
                 coder.getTimeBase().getDenominator());
            System.out.println();
             
            if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) {
                System.out.printf("sample rate: %d; ", coder.getSampleRate());
                System.out.printf("channels: %d; ", coder.getChannels());
                System.out.printf("format: %s", coder.getSampleFormat());
            }
            else if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) {
                System.out.printf("width: %d; ", coder.getWidth());
                System.out.printf("height: %d; ", coder.getHeight());
                System.out.printf("format: %s; ", coder.getPixelType());
                System.out.printf("frame-rate: %5.2f; ", coder.getFrameRate().getDouble());
            }
             
            System.out.println();
            System.out.println("*** End of Stream Info ***");
             
        }
         
    }
 
}

Мы начнем с получения экземпляра IContainer , который является источником данных, который содержит один или несколько потоков аудио и видео данных. Затем мы пытаемся открыть медиафайл и подготовить его к чтению. Если операция прошла успешно, мы можем легко получить информацию, такую ​​как количество содержащихся потоков , общая продолжительность , размер файла и скорость передачи данных .

Обратите внимание, что эта информация отвечает самому контейнеру. Однако мы можем получить метаданные, касающиеся отдельных потоков, из которых состоит контейнер. Мы используем метод getStream для получения ссылки на соответствующий поток, а затем на IstreamCoder, который является декодером, который может декодировать конкретный поток. Из этого объекта мы можем найти тип кодека потока, идентификатор кодека и кучу другой информации.

Наконец, мы можем различать аудио и видео потоки. Для аудиопотоков мы можем найти используемую частоту дискретизации , количество каналов и формат аудиосэмпла . Аналогично, для видеопотоков мы можем получить размеры ( ширину и высоту ), формат пикселя и частоту кадров .

Вот как будет выглядеть пример вывода:

Количество потоков: 2
Продолжительность (мс): 260963888
Размер файла (в байтах): 19007074
Битрейт: 582672
*** Начало потоковой информации ***
поток 0: тип: CODEC_TYPE_AUDIO; кодек: CODEC_ID_AAC; продолжительность: 11507712; время начала: 0; время: 1/44100; кодер tb: 1/44100;
частота дискретизации: 44100; каналы: 2; формат: FMT_S16
*** Конец потока информации ***
*** Начало потоковой информации ***
поток 1: тип: CODEC_TYPE_VIDEO; кодек: CODEC_ID_H264; продолжительность: 7819000; время начала: 0; время: 1/29962; кодер tb: 250/14981;
ширина: 480; высота: 270; формат: YUV420P; частота кадров: 29,96;
*** Конец потока информации ***

Это все, ребята. Мягкое введение в Xuggler для манипуляции с видео. Как всегда, вы можете скачать проект Eclipse, созданный для этого урока.

В следующих уроках я покажу вам кое-что интересное, что можно сделать с помощью Xuggler и FFmpeg , например преобразование и модификацию видео. Так что следите за обновлениями здесь, на JavaCodeGeeks ! И не забудьте поделиться!

Статьи по Теме: