Какую библиотеку я могу использовать для кодирования видео в апплете Java? - PullRequest
0 голосов
/ 03 мая 2009

Я хотел бы записать взаимодействие пользователя в своем Java-апплете в виде видео для отправки (потенциально потокового) на мой сервер с целью загрузки на Youtube (или аналогичный). Высокая частота кадров не требуется (достаточно пары кадров в секунду).

Желательно минимизировать используемую полосу пропускания, поэтому отправка снимков в формате jpeg на сервер и кодирование на стороне сервера - мое последнее средство.

Существуют ли какие-либо облегченные библиотеки кодирования видео Java, для которых не требуется собственный код?

Ответы [ 4 ]

1 голос
/ 14 мая 2013

Вы можете кодировать свои изображения в H.264 / MP4 таким образом, что это сразу же пригодится для потоковой передачи через Интернет. Чтобы загрузить его параллельно с записью, вы можете разбить свою последовательность на небольшие куски, скажем, по 25-100 изображений каждое и загрузить каждый фрагмент как отдельный фильм.

Вы можете сделать это на чистой Java без какого-либо собственного кода, просто используйте JCodec (http://jcodec.org). Вот удобный класс, который вы можете использовать:

public class SequenceEncoder {
    private SeekableByteChannel ch;
    private Picture toEncode;
    private RgbToYuv420 transform;
    private H264Encoder encoder;
    private ArrayList<ByteBuffer> spsList;
    private ArrayList<ByteBuffer> ppsList;
    private CompressedTrack outTrack;
    private ByteBuffer _out;
    private int frameNo;
    private MP4Muxer muxer;

    public SequenceEncoder(File out) throws IOException {
        this.ch = NIOUtils.writableFileChannel(out);

        // Transform to convert between RGB and YUV
        transform = new RgbToYuv420(0, 0);

        // Muxer that will store the encoded frames
        muxer = new MP4Muxer(ch, Brand.MP4);

        // Add video track to muxer
        outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, 25);

        // Allocate a buffer big enough to hold output frames
        _out = ByteBuffer.allocate(1920 * 1080 * 6);

        // Create an instance of encoder
        encoder = new H264Encoder();

        // Encoder extra data ( SPS, PPS ) to be stored in a special place of
        // MP4
        spsList = new ArrayList<ByteBuffer>();
        ppsList = new ArrayList<ByteBuffer>();

    }

    public void encodeImage(BufferedImage bi) throws IOException {
        if (toEncode == null) {
            toEncode = Picture.create(bi.getWidth(), bi.getHeight(), ColorSpace.YUV420);
        }

        // Perform conversion
        transform.transform(AWTUtil.fromBufferedImage(bi), toEncode);

        // Encode image into H.264 frame, the result is stored in '_out' buffer
        _out.clear();
        ByteBuffer result = encoder.encodeFrame(_out, toEncode);

        // Based on the frame above form correct MP4 packet
        spsList.clear();
        ppsList.clear();
        H264Utils.encodeMOVPacket(result, spsList, ppsList);

        // Add packet to video track
        outTrack.addFrame(new MP4Packet(result, frameNo, 25, 1, frameNo, true, null, frameNo, 0));

        frameNo++;
    }

    public void finish() throws IOException {
        // Push saved SPS/PPS to a special storage in MP4
        outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList));

        // Write MP4 header and finalize recording
        muxer.writeHeader();
        NIOUtils.closeQuietly(ch);
    }
}
1 голос
/ 04 мая 2009

Я новичок в Java, поэтому не воспринимайте это всерьез:)

Полагаю, хорошее начало для кодирования видео в Java - Java Media Framework . Я не пробовал, поэтому не знаю, что они поддерживают в кодировке flv.

Поскольку Flash Media Server является коммерческим, не могли бы вы использовать Red5 ? У вас будет SWF, а не апплет, но вы получите более широкий процент зрителей, поскольку Flash Player довольно широко распространен.

И у Алекса есть хорошая точка зрения, так как вам нужно загрузить видео на YouTube, почему бы не использовать их API?

НТН

1 голос
/ 18 ноября 2009

Xuggler может использоваться для кодирования практически любого формата из Java, но для этого требуется, чтобы с ним был установлен собственный компонент. В простой в использовании загрузке нет версии апплета, но некоторые пользователи создали собственные версии FFmpeg и Xuggler, которые они использовали в загружаемых приложениях. Попробуйте узнать в группе пользователей xuggler-users, помогут ли другие.

0 голосов
/ 04 мая 2009

Зачем вам нужно отправлять изображения или видео формы напрямую? Похоже, большой трафик пропускной способности. Просто сериализуйте и отправляйте поток событий пользовательского интерфейса с временными метками и восстанавливайте то, что пользователь должен видеть на вашем сервере позже (некоторые визуальные детали могут зависеть от компьютера / настроек пользователя, но ваш апплет не сможет добраться до них в любом случае прилично).

...