代码之家  ›  专栏  ›  技术社区  ›  Marcello Bastea-Forte

我可以使用哪个库在Java Applet中对视频进行编码?

  •  0
  • Marcello Bastea-Forte  · 技术社区  · 17 年前

    尽量减少使用的带宽是首选,因此将jpeg快照发送到服务器并对服务器端进行编码是我的最后手段。

    4 回复  |  直到 17 年前
        1
  •  1
  •   George Profenza    17 年前

    我是java新手,所以不要太当真:)

    Java Media Framework . 我还没有尝试过,所以我不知道他们在flv编码上支持什么。

    既然Flash媒体服务器是商用的,你不能用吗 Red5

    亚历克斯有一个很好的观点,既然你需要上传视频到youtube,为什么不使用他们的API?

    人酪氨酸羟化酶

        2
  •  1
  •   Art Clarke    16 年前
        3
  •  1
  •   Stanislav Vitvitskyy    13 年前

    您可以在纯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);
        }
    }
    
        4
  •  0
  •   Alex Martelli    17 年前

    为什么您需要直接发送图像或视频表格?听起来像是一笔巨大的带宽支出。只需序列化并发送带有时间戳的UI事件流,然后重建用户稍后在服务器上应该看到的内容(一些视觉细节可能取决于用户的机器/设置,但你的applet无论如何都无法正常访问它们)。