2015-08-05 4 views
3

Здравствуйте разработчикам коллег,Java - Запись видео и аудио в то же время FFmpeg

Я в настоящее время разрабатывает инструмент, который может оказать видео, выполнив FFmpeg с помощью процесса Java и подкормки видеокадры к нему.

В настоящее время я использую следующую команду FFmpeg: ffmpeg -y -f rawvideo -pix_fmt rgb24 -s %WIDTH%x%HEIGHT% -r %FPS% -i - -an -c:v libx264 -preset ultrafast -pix_fmt yuv420p "%FILENAME%.mp4", где заменители заменены на реальные значения.

код я использую для инициализации FFmpeg:

//commandArgs is a list of command line arguments for FFmpeg 

    List<String> command = new ArrayList<String>(); 
    command.add("ffmpeg"); 
    command.addAll(commandArgs); 

    process = new ProcessBuilder(command).directory(outputFolder).start(); 
    OutputStream exportLogOut = new FileOutputStream("export.log"); 
    new StreamPipe(process.getInputStream(), exportLogOut).start(); 
    new StreamPipe(process.getErrorStream(), exportLogOut).start(); 
    outputStream = process.getOutputStream(); 
    channel = Channels.newChannel(outputStream); 

Тогда, у меня есть следующий метод, чтобы написать ByteBuffer, содержащий видеокадр FFmpeg:

public void consume(ByteBuffer buf) { 
    try { 
     channel.write(buf); 
     ByteBufferPool.release(buf); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

Теперь мой вопрос есть, как я буду продолжать писать синхронные аудиоданные в выходной файл? Я полагаю, что мне нужно использовать несколько труб, и я, конечно, придется изменить свои аргументы командной строки, но мне нужна помощь:

1) what kind of Audio Data do I need to feed FFmpeg with? 
2) how do I feed Audio and Video in one go? 
3) how do I keep Audio and Video synchronized? 

Спасибо заранее за любую помощь!

Привет, CrushedPixel

ответ

1

Посмотрите на https://github.com/artclarke/humble-video, который является оберткой FFmpeg в Java. Вы можете добавлять видео/аудиопотоки динамически в кодировщик.

+0

Это не вариант, поскольку мы не можем распространять нашу работу по лицензии AGPL. – CrushedPixel

+0

Возможно, я ошибаюсь, но лицензия AGPL предназначена для модификаций и распространения скромного видео, а не для программного обеспечения, использующего скромное видео в качестве библиотеки/API. Также существует устаревшая, устаревшая версия программного обеспечения на https://github.com/artclarke/xuggle-xuggler, которая является GPL, если это соответствует вашим требованиям. –

+0

Вы ошибаетесь - нам также необходимо распространять наш инструмент как AGPL/GPL, что невозможно для нашего проекта. Спасибо в любом случае :) – CrushedPixel

3

Это форматы мультиплексирования, в идеале вы хотите использовать формат мультиплексирования для передачи данных в FFmpeg. Пример того, как FFmpeg делает это внутренне, является взаимодействием между ffmpeg.exe и ffserver.exe, и он делает это через формат пользовательского/внутреннего потокового файла, называемый FFM. Полную информацию о реализации можно найти here. Очевидно, вы также можете использовать другие форматы мультиплексирования, такие же простые, как AVI. Синхронизация выполняется автоматически, так как файл предоставляет временные метки.

Что касается типа аудиоданных, это действительно может быть что угодно, большинство людей будут использовать необработанный, чередующийся звук PCM (либо float, либо int16).

+0

Возможно, вы можете вводить данные из двух входов «именованных каналов» или тому подобного, если у вас есть синхронный вход [?] – rogerdpack

+0

@rogerdpack можно безопасно получать именованные каналы на * любом * ОПЕРАЦИОННЫЕ СИСТЕМЫ? – CrushedPixel

+0

@rogerdpack Я решил использовать именованные каналы из-за проблемы с синхронизацией, но да, если вы можете постоянно поддерживать постоянную и непрерывную частоту кадров видео и аудио, это проще. –

Смежные вопросы