Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xuggle和直播rtmp_Java_Rtmp_Live Streaming_Xuggle - Fatal编程技术网

Java xuggle和直播rtmp

Java xuggle和直播rtmp,java,rtmp,live-streaming,xuggle,Java,Rtmp,Live Streaming,Xuggle,我发现了一个使用xuggle的实时广播rtmp示例,但我无法运行它,因为xuggle发行版不包括libx264-normal.ffpreset,这是建议从发行版中获取的。 也许一个例子只适用于旧版本的xuggle,如果是的话,是否有使用最新版本的xuggle进行直播的例子 import com.xuggle.xuggler.Configuration; import com.xuggle.xuggler.ICodec; import com.xuggle.xuggler.IContainer;

我发现了一个使用xuggle的实时广播rtmp示例,但我无法运行它,因为xuggle发行版不包括libx264-normal.ffpreset,这是建议从发行版中获取的。 也许一个例子只适用于旧版本的xuggle,如果是的话,是否有使用最新版本的xuggle进行直播的例子

import com.xuggle.xuggler.Configuration;
import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IContainerFormat;
import com.xuggle.xuggler.IPacket;
import com.xuggle.xuggler.IPixelFormat;
import com.xuggle.xuggler.IRational;
import com.xuggle.xuggler.IStream;
import com.xuggle.xuggler.IStreamCoder;
import com.xuggle.xuggler.IVideoPicture;
import com.xuggle.xuggler.video.ConverterFactory;
import com.xuggle.xuggler.video.IConverter;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class XugglerRtmpReferenceImpl {
    private static String url = "";
    private static String fileName = "/home/pavel/test.flv";
    private static int framesToEncode = 60;
    //screen capture size/pos 
    private static int x = 0;
    private static int y = 0;
    private static int height = 480;
    private static int width = 640;
    public static void main(String[] args) {
        IContainer container = IContainer.make();
        IContainerFormat containerFormat_live =
                IContainerFormat.make();
        containerFormat_live.setOutputFormat("flv", url + fileName,
                null);
        container.setInputBufferLength(0);
        int retVal = container.open(url + fileName,
                IContainer.Type.WRITE, containerFormat_live);
        if (retVal < 0) {
            System.err.println("Could not open output container for live stream");
                    System.exit(1);
        }
        IStream stream = container.addNewStream(0);
        IStreamCoder coder = stream.getStreamCoder();
        ICodec codec =
                ICodec.findEncodingCodec(ICodec.ID.CODEC_ID_H264);
        coder.setNumPicturesInGroupOfPictures(5);
        coder.setCodec(codec);
        coder.setBitRate(200000);
        coder.setPixelType(IPixelFormat.Type.YUV420P);
        coder.setHeight(height);
        coder.setWidth(width);
        System.out.println("[ENCODER] video size is " + width + "x" +
                height);
        coder.setFlag(IStreamCoder.Flags.FLAG_QSCALE, true);
        coder.setGlobalQuality(0);
        IRational frameRate = IRational.make(5, 1);
        coder.setFrameRate(frameRate);
        coder.setTimeBase(IRational.make(frameRate.getDenominator(),
                frameRate.getNumerator()));
        Properties props = new Properties();
        InputStream is =
                XugglerRtmpReferenceImpl.class.getResourceAsStream("/libx264-normal.ffpreset");
        try {
            props.load(is);
        } catch (IOException e) {
            System.err.println("You need the libx264-normal.ffpreset file from the Xuggle distribution in your classpath.");
                    System.exit(1);
        }
        Configuration.configure(props, coder);
        coder.open();
        container.writeHeader();
        long firstTimeStamp = System.currentTimeMillis();
        long lastTimeStamp = -1;
        int i = 0;
        try {
            Robot robot = new Robot();
            while (i < framesToEncode) {
                //long iterationStartTime = 
                System.currentTimeMillis();
                long now = System.currentTimeMillis();
                //grab the screenshot 
                BufferedImage image = robot.createScreenCapture(new
                        Rectangle(x, y, width, height));
                //convert it for Xuggler 
                BufferedImage currentScreenshot = new
                        BufferedImage(image.getWidth(), image.getHeight(),
                        BufferedImage.TYPE_3BYTE_BGR);
                currentScreenshot.getGraphics().drawImage(image, 0, 0,
                        null);
                //start the encoding process 
                IPacket packet = IPacket.make();
                IConverter converter =
                        ConverterFactory.createConverter(currentScreenshot,
                                IPixelFormat.Type.YUV420P);
                long timeStamp = (now - firstTimeStamp) * 1000; //  convert to microseconds
                IVideoPicture outFrame =
                        converter.toPicture(currentScreenshot, timeStamp);
                if (i == 0) {
                    //make first frame keyframe 
                    outFrame.setKeyFrame(true);
                }
                outFrame.setQuality(0);
                coder.encodeVideo(packet, outFrame, 0);
                outFrame.delete();
                if (packet.isComplete()) {
                    container.writePacket(packet);
                    System.out.println("[ENCODER] writing packet of size " + packet.getSize() + " for elapsed time " + ((timeStamp -
                    lastTimeStamp) / 1000));
                    lastTimeStamp = timeStamp;
                }
                System.out.println("[ENCODER] encoded image " + i + " in " + (System.currentTimeMillis() - now));
                        i++;
                try {
                    // sleep for framerate milliseconds 
                    Thread.sleep(Math.max((long) (1000 /
                            frameRate.getDouble()) - (System.currentTimeMillis() - now), 0));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //Thread.sleep((long) (1000 / frameRate.getDouble())); 
            }
        } catch (AWTException e) {
            e.printStackTrace();
        }
        container.writeTrailer();
    }
}
导入com.xuggle.xuggler.Configuration;
导入com.xuggle.xuggler.ICodec;
导入com.xuggle.xuggler.IContainer;
导入com.xuggle.xuggler.IContainerFormat;
导入com.xuggle.xuggler.IPacket;
导入com.xuggle.xuggler.IPixelFormat;
导入com.xuggle.xuggler.IRational;
导入com.xuggle.xuggler.IStream;
导入com.xuggle.xuggler.IStreamCoder;
导入com.xuggle.xuggler.IVideoPicture;
导入com.xuggle.xuggler.video.ConverterFactory;
导入com.xuggle.xuggler.video.IConverter;
导入java.awt.AWTException;
导入java.awt.Rectangle;
导入java.awt.Robot;
导入java.awt.image.buffereImage;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.Properties;
公共类XugglerRtmpReferenceImpl{
私有静态字符串url=“”;
私有静态字符串fileName=“/home/pavel/test.flv”;
私有静态int framesToEncode=60;
//屏幕截图尺寸/位置
私有静态int x=0;
私有静态int y=0;
专用静态整数高度=480;
专用静态整数宽度=640;
公共静态void main(字符串[]args){
IContainer容器=IContainer.make();
IContainerFormat_live=
IContainerFormat.make();
containerFormat_live.setOutputFormat(“flv”,url+文件名,
无效);
container.setInputBufferLength(0);
int retVal=container.open(url+fileName,
IContainer.Type.WRITE,containerFormat_live);
如果(返回值<0){
System.err.println(“无法打开实时流的输出容器”);
系统出口(1);
}
IStream stream=container.addNewStream(0);
IStreamCoder coder=stream.getStreamCoder();
ICodec编解码器=
ICodec.findEncodingCodec(ICodec.ID.CODEC\u ID\u H264);
编码者。设置图片组(5);
编码器。设置编解码器(编解码器);
立贝特编码公司(200000);
coder.setPixelType(IPixelFormat.Type.YUV420P);
编码器设置高度(高度);
编码器设置宽度(宽度);
System.out.println(“[ENCODER]视频大小为”+width+x”+
高度);
coder.setFlag(IStreamCoder.Flags.flagqscale,true);
编码器。设置全局质量(0);
IRational帧率=IRational.make(5,1);
编码器。设置帧速率(帧速率);
coder.setTimeBase(IRational.make(frameRate.getDenominator()),
frameRate.getNumerator());
Properties props=新属性();
输入流是=
XugglerRtmpReferenceImpl.class.getResourceAsStream(“/libx264 normal.ffpreset”);
试一试{
道具载荷(is);
}捕获(IOE异常){
System.err.println(“您需要类路径中Xuggle发行版的libx264-normal.ffpreset文件”);
系统出口(1);
}
配置(道具、编码器);
coder.open();
container.writeHeader();
long firstTimeStamp=System.currentTimeMillis();
长lastTimeStamp=-1;
int i=0;
试一试{
机器人=新机器人();
while(i
你能告诉我什么是/libx26吗