рдПрдВрдбреНрд░реЙрдЗрдб рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рд╡реЗрдмрдХреИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ


рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрддреА, рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдлреЛрди рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд▓рдЧрднрдЧ" рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡реЗрдм рдХреИрдорд░рд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рдХрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП "рдЖрд╡рд╢реНрдпрдХ" рдЫрд╡рд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдореИрдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЕрдЧрд░ рд╣рд╛рде рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рд╡рд╛рд▓рд╛ рдХреЛрдИ рдлреЛрди рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдорд╛рд░реНрдХрд░ рдорд╛рдиреНрдпрддрд╛ рдкрджреНрдзрддрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рд╡реЗрдм рдХреИрдорд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░


рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдореБрд▓реЗрдЯрд░ рдФрд░ рдХреИрдорд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ:

рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╡реЗрдмрдХреИрдо рд╕реЗ рдЫрд╡рд┐рдпрд╛рдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рд╕рдорд╛рдзрд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг


1) рдЖрдк рдПрдВрдбреНрд░реЙрдЗрдб рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдУрдкрдирд╕реЛрд░реНрд╕ рдореЗрдВ рд╣реИред
2) рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
3) Android x86 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдордзреБрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рдПрдореНрдпреВрд▓реЗрдЯрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдорд╛рд░реНрдЪ 2011 рд╕реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рд╡рд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ, рдпрд╣ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬреЗрджрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреБрддреНрдкрд╛рджрдХ рд╣реИред рдХреНрдпрд╛ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдФрд░ v4l2 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреБрднрд╡ рд╣реИред
Androidx86 рдПрдХ рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ... рдореИрдВ рд╡реЗрдмрдХреИрдо рдХреЛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖред
рдкрд╣рд▓реЗ рдФрд░ рддреАрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рд▓рдбрд╝реЗрдВрдЧреЗред
рд╡рд┐рдЪрд╛рд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдореБрд▓реЗрдЯрд░ рдФрд░ рдПрдкреАрдЖрдИ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирдП рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреЗрдПрдордПрдл рдХреЗ рд▓рд┐рдПред рдорд╣рд╛рди рд╕рдорд╛рдзрд╛рди, рд▓реЗрдХрд┐рди рдЬреЗрдПрдордПрдл рдиреЗ рдореЗрд░реЗ рдХреИрдорд░реЗ рдХреЛ рдирд╣реАрдВ рдкрд╣рдЪрд╛рдирд╛ред рд▓рд┐рдирдХреНрд╕ рдпрд╛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЬреЗрдПрдордПрдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдорд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ (рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рдХрд┐рдпрд╛, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЖрдЧреЗ рдХреА рд╕рднреА рдХреНрд░рд┐рдпрд╛рдПрдВ рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдХреАрдВред рд╣рдо рддреИрдпрд╛рд░ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╕реНрд░реЛрдд рдХреЛрдб рдХреНрд▓рд╛рд╕рд┐рдХ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕рд░реНрд╡рд░ рдХреИрдорд░реЗ рд╕реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ) рдЗрди рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ


JDK
Android рдПрд╕рдбреАрдХреЗ
рдЧреНрд░рд╣рдг + рдЧреВрдЧрд▓ ADT
v4l4j
/ рджреЗрд╡ / рд╡реАрдбрд┐рдпреЛ0 - рд╡реЗрдм рдХреИрдорд░рд╛ред

рд╕рд░реНрд╡рд░


рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЬрд╛рдиреЗ рдФрд░ v4l4j рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдЬреЛ рдореЗрд░реЗ рдХреИрдорд░реЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ JMF рдХреЗ рдмрдЬрд╛рдп рдпрд╣ v4l4j рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ рд╣реИред

рд╕рдВрд╢реЛрдзрд┐рдд WebBroadcaster (рдореИрдВ рдХреЛрдб рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдХрд╛рдо рдХрд╛ рддрд░реНрдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛред рдЯреЙрдо рдЧрд┐рдмрд░рд╛ рджреНрд╡рд╛рд░рд╛, рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ v4l4j рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ)ред

package com.webcambroadcaster; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import au.edu.jcu.v4l4j.DeviceInfo; import au.edu.jcu.v4l4j.FrameGrabber; import au.edu.jcu.v4l4j.V4L4JConstants; import au.edu.jcu.v4l4j.VideoDevice; import au.edu.jcu.v4l4j.VideoFrame; /** * A disposable class that uses JMF to serve a still sequence captured from a * webcam over a socket connection. It doesn't use TCP, it just blindly * captures a still, JPEG compresses it, and pumps it out over any incoming * socket connection. * * @author Tom Gibara * */ public class WebcamBroadcaster { public static boolean RAW = false; public static void main(String[] args) { int[] values = new int[args.length]; for (int i = 0; i < values.length; i++) { values[i] = Integer.parseInt(args[i]); } //Parse inputs WebcamBroadcaster wb; if (values.length == 0) { wb = new WebcamBroadcaster(); } else if (values.length == 1) { wb = new WebcamBroadcaster(values[0]); } else if (values.length == 2) { wb = new WebcamBroadcaster(values[0], values[1]); } else { wb = new WebcamBroadcaster(values[0], values[1], values[2]); } //Start the grabbing procedure wb.start(); } public static final int DEFAULT_PORT = 9889; public static final int DEFAULT_WIDTH = 320; public static final int DEFAULT_HEIGHT = 240; private final Object lock = new Object(); private final int width; private final int height; private final int port; private boolean running; private boolean stopping; private Worker worker; private VideoDevice vd=null; private FrameGrabber fg=null; public WebcamBroadcaster(int width, int height, int port) { this.width = width; this.height = height; this.port = port; } public WebcamBroadcaster(int width, int height) { this(width, height, DEFAULT_PORT); } public WebcamBroadcaster(int port) { this(DEFAULT_WIDTH, DEFAULT_HEIGHT, port); } public WebcamBroadcaster() { this(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_PORT); } public void start() { synchronized (lock) { if (running) return; //Starting capture startCapture(); worker = new Worker(); worker.start(); System.out.println("Start capture"); running = true; } } public void releaseCapture(){ fg.stopCapture(); vd.releaseFrameGrabber(); vd.release(); } public void startCapture(){ try{ String dev = "/dev/video0"; vd = new VideoDevice(dev); fg = vd.getJPEGFrameGrabber(width, height, 0, 0, 80); fg.startCapture(); }catch(Exception e){ e.printStackTrace(); } } public void stop() throws InterruptedException { synchronized (lock) { if (!running) return; // //Stop capture at this place releaseCapture(); // stopping = true; running = false; worker = null; } try { worker.join(); } finally { stopping = false; } } private class Worker extends Thread { private final int[] data = new int[width*height]; public byte[] b=null; @Override public void run() { ServerSocket ss; VideoFrame frm; try { ss = new ServerSocket(port); } catch (IOException e) { e.printStackTrace(); return; } while(true) { synchronized (lock) { if (stopping) break; } Socket socket = null; try { socket = ss.accept(); //Grab image here try{ // frm = fg.getVideoFrame(); System.out.println("Datagrabbed"); OutputStream out = socket.getOutputStream(); DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(out)); dout.write(frm.getBytes(), 0, frm.getFrameLength()); dout.close(); System.out.println("Datasent"); frm.recycle(); // }catch(Exception e){ e.printStackTrace(); return; } socket.close(); socket = null; } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) try { socket.close(); } catch (IOException e) { /* ignore */ } } } try { ss.close(); } catch (IOException e) { /* ignore */ } } } } 


рдХрд╛рдо рдХрд╛ рддрд░реНрдХ рдХреНрдпрд╛ рд╣реИ:
рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдХреИрдорд░рд╛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдФрд░ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░реЗрдВ:
  public void startCapture(){ try{ String dev = "/dev/video0"; vd = new VideoDevice(dev); fg = vd.getJPEGFrameGrabber(width, height, 0, 0, 80); fg.startCapture(); }catch(Exception e){ e.printStackTrace(); } } 

рдлрд┐рд░, рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдЬреБрдбрд╝рддрд╛ рд╣реИ, рд╣рдо рдЙрд╕реЗ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдПрдХ рдЗрдореЗрдЬ рднреЗрдЬрддреЗ рд╣реИрдВ:
  try{ // frm = fg.getVideoFrame(); System.out.println("Datagrabbed"); OutputStream out = socket.getOutputStream(); DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(out)); dout.write(frm.getBytes(), 0, frm.getFrameLength()); dout.close(); System.out.println("Datasent"); frm.recycle(); // }catch(Exception e){ e.printStackTrace(); return; } 


рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдкреБрд░рд╛рдиреЗ getVideoFrame () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреИрдорд░реЗ рдкрд░ рдПрдХ рдирдпрд╛ рдлреНрд░реЗрдо рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░реЗ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рддрд░реНрдХ рдореЗрдВ рднреА рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ, рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛ред рдмрд╛рдж рдореЗрдВ рдЬрдм рд╕рдордп рд╣реЛрддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕реНрддрд░ рдкрд░ рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИ ... рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдордЬреЗрдкреАрдИрдЬреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ / рдПрдХреНрд╕-рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ HTTP рд╕рд░реНрд╡рд░ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд┐рддреНрд░ рдЖрддреЗ рд╣реИрдВред

рдЧреНрд░рд╛рд╣рдХ


рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреИрдорд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ ред рд╣рдо рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рд╕рд░рд▓ рдХрд░реЗрдВрдЧреЗ (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП) рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдЗрдиреЗрдВ: рд╡рд╣ рд╡рд░реНрдЧ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред

 preview = new Preview(this); ((FrameLayout) findViewById(R.id.preview)).addView(preview); 


рдФрд░ рд╡рд░реНрдЧ рд╣реА:

 package com.example; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.Button; import android.widget.FrameLayout; public class CameraDemo extends Activity { private static final String TAG = "CameraDemo"; Preview preview; Button buttonClick; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); preview = new Preview(this); ((FrameLayout) findViewById(R.id.preview)).addView(preview); Log.d(TAG, "It were created"); } } 

рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рдЕрдВрджрд░, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдЙрд╕ рд╕рддрд╣ рдХреЛ рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 package com.example; import java.io.IOException; import android.content.Context; import android.hardware.Camera; import android.view.SurfaceHolder; import android.view.SurfaceView; class Preview extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; public Camera camera; Preview(Context context) { super(context); // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw. camera = Camera.open(); try { camera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } } public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return, so stop the preview. // Because the CameraDevice object is not a shared resource, it's very // important to release it when the activity is paused. camera.stopPreview(); camera = null; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // Now that the size is known, set up the camera parameters and begin // the preview. Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(w, h); camera.setParameters(parameters); camera.startPreview(); } } 

рдпрджрд┐ рдпрд╣ рдХреЛрдб рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдКрдкрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдПрдХ рдмреЙрдХреНрд╕ рдорд┐рд▓рддрд╛ рд╣реИред
рдЕрдм, рд╣рдо рдХрдХреНрд╖рд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛рдПред
1) рдпрд╣рд╛рдВ рд╕реЗ рд╕реЙрдХреЗрдЯрдордХреЗрд░рд╛ рдХреНрд▓рд╛рд╕ рд╕реЛрд░реНрд╕ рд▓реЗрдВред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
2) рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╡рд░реНрдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рдмрджрд▓реЗрдВ:
 package com.example; import java.io.IOException; import android.content.Context; import android.hardware.Camera; import android.view.SurfaceHolder; import android.view.SurfaceView; class Preview extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; //public Camera camera; public SocketCamera camera; Preview(Context context) { super(context); // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); //mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL); } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw. //camera = Camera.open(); camera = SocketCamera.open(); try { camera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } } public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return, so stop the preview. // Because the CameraDevice object is not a shared resource, it's very // important to release it when the activity is paused. camera.stopPreview(); camera = null; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // Now that the size is known, set up the camera parameters and begin // the preview. Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(w, h); camera.setParameters(parameters); camera.startPreview(); } } 


рдкрд░рд┐рдгрд╛рдо


рдЕрдм рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВ:
java -Djava.library.path = / opt / Android / v4l4j-0.8.10 -cp "/opt /Android/v4l4j-0.8.10/v4l4j.jar:.//" com / webcambroadcaster / WebcamBroadcaster

рдЬрд╣рд╛рдБ -Djava.library.path = / opt / Android / v4l4j-0.8.10 рдЖрдкрдХреЗ v4l4j рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдкрде рд╣реИ

рдПрдореБрд▓реЗрдЯрд░ рдкрд░ CameraDemo рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдПрдВред рдирддреАрдЬрддрди, рд╣рдо рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдзрд╛рдЧрд╛ рдереЛрдбрд╝рд╛ рдЭрдЯрдХрд╛ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рджреЗрд░ рд╕реЗ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред



рдЧреНрд░рд╛рд╣рдХ рд╕реНрд░реЛрдд: CameraDemo.zip
рд╕рд░реНрд╡рд░ рд╕реНрд░реЛрдд: WebBroadcaster.zip

рдЕрдВрддрднрд╛рд╖рдг


рдореИрдВрдиреЗ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд╕реАрдорд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕реАрдорд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдЦрд░реАрджрдирд╛ рдЕрдХреНрд╕рд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдПрдореБрд▓реЗрдЯрд░ рдЗрд╕ рджрд╣рд▓реАрдЬ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣реА рд╣рдЯрд╛рддрд╛ рд╣реИред
рдФрд░ рдлрд┐рд░ iPhone рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╕реАрдорд╛ рд╣реИ?

рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдкрд░ рдХрд┐ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рд╕рдореБрджрд╛рдп рдХрд╛ рд╕рджрд╕реНрдп рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛, рд╕рд╡рд╛рд▓ рдЙрдарддреЗ рд╣реИрдВ:
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд▓рд╛рдн рд╣реИ?
рд╢рд╛рдпрдж рд╕рдореБрджрд╛рдп рдХрд╛ рдХрд╛рдо Google рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ?
рдХреНрдпрд╛ рдЕрдм рд╕рдореБрджрд╛рдп рд╕реЗ рдХреБрдЫ рдЫрд┐рдкрд╛рдирд╛ рд╣реИ?
рдФрд░ рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдФрд░ рдкреВрд░рдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдЫрд┐рдкрд╛рдХрд░ рд╡рд┐рд╢рд╛рд▓ рдХреНрдпрд╛ рдЦреЛ рджреЗрддрд╛ рд╣реИ?

UPD: рдпрд╣ рд╕рдм рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред skl1f рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрдорд░рд╛ SDK рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИред
developer.android.com/sdk/tools-notes.html - рдЬреИрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╣рд╛рдБ рдХрд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдореИрдиреБрдЕрд▓: developer.android.com/guide/developing/devices/emulator.html - рдирд╣реАрдВред рдЖрдкрдХреЛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

UPD2: рдЬрд╛рдБрдЪ рдХреА рдЧрдИред рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдХреИрдорд░рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрд╕рдбреАрдХреЗ рдЯреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ ред 14 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдФрд░ рдХреЗрд╡рд▓ рдПрдВрдбреНрд░реЙрдЗрдб 4.0 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреЗ рд▓рд┐рдП ред рдкреБрд░рд╛рдиреЗ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

Source: https://habr.com/ru/post/In136075/


All Articles