Недавно каплер кадров FFMPEGFRAMEGRABBER с использованием пакета JAVACV FFMPEG синхронизировал захваченные аудиокадры и видео кадры. Используемый метод синхронизации - это синхронизировать видео с аудио.
Программы и исходные коды
Конкретные идеи следующие:
(1) Сначала представить, как FFMPEG фиксирует изображения и звуки видеофайлов.
Ffmpegframegrabber fg = new ffmpegframegrabber ("Путь видеофайла или URL); После получения объекта захвата кадра вызов его метода grab () вернет захваченный объект кадра. Этот кадр может быть видео кадром или аудио кадром, потому что аудио и видео кадры расположены первыми во время воспроизведения в соответствии с временной меткой. Конечно, захваченные рамки декодируются и хранятся в объекте Java.nio.buffer. Для видео кадров буфер для хранения пиксельных данных изображения, таких как RGB, а затем передавать
BufferedImage bi = (new java2dframeconverter ()). GetBufferedImage (f);
Вы можете получить изображение, и полученное изображение может быть обработано в серии процессов или отображаться непосредственно на компоненте свинга без обработки. Соответствующий аудио кадре, буфер - это данные PCM, которые хранят аудио. Этот PCM может быть плавающей или коротким, а затем метод SourceDataline.write в java.sounds.sample может использоваться для написания этих данных аудио PCM на динамик.
(2) Затем представите, как непрерывно разыграть полученные кадры. Во -первых, воспроизводите видео отдельно:
while (true) {frame f = fg.grab (); if (f.image! = null) label.seticon (new imageicon ((new java2dframeconverter ()). getBufferedImage (f))); Thread.sleep (1000/частота видео кадров); } То же самое относится и к воспроизведению звука отдельно, просто напишите данные на звуковую карту. пример
(3) Производственная и потребительская модель.
Приведенная выше изображение - это метод, реализованный программой. Захваченные рамы оцениваются с использованием режима производителя. Если это видео кадр, он будет выпущен в видео Fifo. Если это звуковая рамка, он будет производиться в аудиофифу. Затем ветка воспроизведения звука и ветка воспроизведения видео потребляют кадры из их соответствующих складов кадров соответственно. Режим потребителя производства принимается, потому что скорость захвата кадров больше, чем потребление кадров, поэтому мы предпочитаем захватывать кадры для буферизации или дальнейшего предварительного обработки захваченных кадров, в то время как потоки воспроизведения видео и воспроизведения звука должны только напрямую воспроизводить и отображать обработанные рамы.
(4) Методы реализации аудио и синхронизации видео: воспроизводите все видео кадры в двух кадрах аудио.
Для достижения аудио и синхронизации видео у вас должен быть марка кадров. Кадры, запечатленные здесь, представляют собой только PTS Playback TimeStamp, и нет декодированных DTS DTS, поэтому нам нужно только определить, как TimeStemplact на основе воспроизведения на основе TimeStamp.
Реализация программы основана на вышеуказанном рисунке. Когда звуковой поток начинает воспроизводить Audio Frame A1, вызывается метод сетруна видеотехника, а аудио -кадр TimeStamp и следующий раз марки следующего кадра Audio A2 передается в видеоте в сфере видео в состоянии ожидания. Затем видеозамен начинается и начинает снимать видео кадр G1 из видео FIFO, а затем вычисляет разницу во времени между G1 и A1 в качестве задержки воспроизведения. После Thread.sleep (T1) видеотехта отображает изображение на компоненте свинга, такую как jlabel.seticon (изображение). Затем видеотехта снимает еще одну кадр изображения G2 и сравнивает TimeStamp of G2 с временной меткой A2. Если временная метка G2 меньше A2, видео -нить продолжает откладывать T2 и воспроизводит изображение G2. Тогда G3 такой же, как и должен, пока G4 не будет получен, а A2 сравнивает с A2 и обнаруживает, что временная метка G4 больше A2, тогда видеоте впадает в состояние ожидания и ожидает следующего запуска. Затем, после того, как аудиопродаж воспроизводит звуковую рамку A1, он снимает аудио кадр A3 со склада, затем передает TimeStamp of A2 и временные метки A3 в видеоте, а затем начинает воспроизводить A2, а затем заблокированная видеоте продолжает играть.
(5) Динамически настраивает время задержки
Поскольку персональные ПК не являются операционными системами в реальном времени, то есть Thread.Sleep является неточным и ограничивается звуковой картой для воспроизведения звука, приведенные выше идеи базовой реализации необходимо улучшить. Прежде всего, метод источника Java состоит в том, чтобы извлечь данные, записанные аудиотоком из внутреннего буфера с определенной скоростью. Если данные, написанные аудио, будут взяты, воспроизведение звука будет заикано. Тем не менее, если слишком много аудиоданных записано в свое время, звук и видео могут быть не в синхронизации. Следовательно, необходимо убедиться, что внутренний буфер источника имеет определенные данные, в противном случае он вызовет отставание, но объем данных не может быть слишком большим. Поэтому мы настраиваем воспроизведение звука от G3 до A2. Из -за неточности задержки данные, записанные в кадре A1, могут быть удалены звуковой картой до того, как время достигнет T6. Поэтому после воспроизведения изображения G3 звуковой поток будет судить о суду на основе объема данных, возвращаемых SourceDataline.vailable (). Если объем данных должен быть закончен, время задержки T4 от G3 до A2 уменьшается. Это гарантирует, что объем данных не изменится до 0 и вызывает заикание звука.
(6) Ниже приведена диаграмма результатов теста программы в соответствии с Windows 64 и Ubuntu14: воспроизведение относительно плавное, а также возможна синхронизация, но если воспроизведение включено, оно застрянет, если Penguin запишет код в IDE, такой как идея. В конце концов, идея также разрабатывается в Java, поэтому действие идеи повлияет на другие программы Java, но другие процессы не будут.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.