2009-05-03 11 views
0

자바 애플릿에 사용자의 상호 작용을 비디오로 보내서 (잠재적으로 스트림) 내 서버에 Youtube (또는 이와 유사한)로 업로드 할 의도로 기록하고 싶습니다. 높은 프레임 속도는 필요하지 않습니다 (초당 몇 프레임만으로 충분합니다).자바 애플릿에서 비디오를 인코딩하는 데 사용할 수있는 라이브러리는 무엇입니까?

사용되는 대역폭을 최소화하는 것이 바람직하므로 jpeg 스냅 샷을 서버에 보내고 서버 쪽을 인코딩하는 것이 가장 마지막 수단입니다.

네이티브 코드가 필요없는 경량 Java 비디오 인코딩 라이브러리가 있습니까?

답변

0

왜 이미지 또는 비디오 형식을 직접 보내야합니까? 큰 대역폭 비용처럼 들립니다. 시간 스탬프를 사용하여 UI 이벤트 스트림을 직렬화하고 보내고 나중에 사용자가 서버에서 볼 수있는 내용을 재구성합니다 (일부 시각적 정보는 사용자의 컴퓨터/설정에 따라 다를 수 있지만 애플릿은 사용자에게 도달 할 수 없습니다). 알맞게 어쨌든).

+0

Alex : 이것 또한 탐색하는 옵션입니다. 애플릿의 계산 및 메모리 요구 사항으로 인해 실제로 큰 비용, YouTube 품질 비디오의 10MB 대역폭 또는 사용자의 상호 작용 서버 측을 재현 할 수있는 컴퓨팅 성능이 무엇인지 확실하지 않습니다. –

1

나는 자바에 새로 온 것은 그래서이 심각하게 고려하지 않는 :

내가 자바 비디오 인코딩과 함께 좋은 출발을 추측 Java Media Framework입니다. 나는 이것을 시도하지 않았기 때문에 flv 인코딩에 대한 지원이 무엇인지 알지 못합니다.

Flash Media Server는 상업용이므로 Red5을 사용할 수 없습니까? 애플릿이 아닌 swf가 있지만, Flash Player가 꽤 널리 퍼져 있기 때문에 더 많은 비율의 뷰어를 얻게됩니다.

그리고 비디오를 YouTube에 업로드해야하기 때문에 Alex가 좋은 지적을했습니다. 왜 API를 사용하지 않을까요?

HTH

+0

George : 저는 과거에 red5와 함께 작업 해 왔지만 콘텐츠 자체를 생성 할 수 있는지 또는 Flash 클라이언트에서 콘텐츠를 제공/수신 할 수 있는지 기억이 안납니다. JMF를 탐구해야합니다 ... –

1

Xuggler은 거의 자바에서 모든 형식을 인코딩하는 데 사용하지만, 그것으로 설치해야하는 기본 구성 요소를 필요로 할 수있다. 사용하기 쉬운 애플릿 버전이 없지만 일부 사용자는 다운로드 가능한 응용 프로그램에서 사용한 FFmpeg 및 Xuggler의 사용자 정의 버전을 작성했습니다. xuggler-users 사용자 그룹에서 다른 사용자가 도움이되는지 확인해보십시오.

1

이미지를 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); 
    } 
}