2017-07-26 12 views
5

मैंने पृष्ठभूमि में सामने वाले कैमरे को रिकॉर्ड करने के लिए नीचे दिखाए गए एंड्रॉइड सेवा को लिखा है। यह बहुत अच्छी तरह से काम करता है। लेकिन अब मैं रिकॉर्डिंग करते समय हर 5 सेकंड में एक तस्वीर लेना चाहता हूं। क्या यह किसी भी तरह से संभव है? जब मैं दूसरा कैमरा खोलने की कोशिश करता हूं (दूसरी सेवा में) मुझे एक त्रुटि मिल रही है।एंड्रॉइड पर वीडियो रिकॉर्ड करते समय तस्वीर लेना

public class RecorderService extends Service implements SurfaceHolder.Callback { 

    private WindowManager windowManager; 
    private SurfaceView surfaceView; 
    private Camera camera = null; 
    private MediaRecorder mediaRecorder = null; 

    @Override 
    public void onCreate() { 
     // Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback 
     windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); 
     surfaceView = new SurfaceView(this); 
     WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
       1, 1, 
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
       WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
       PixelFormat.TRANSLUCENT 
     ); 
     layoutParams.gravity = Gravity.LEFT | Gravity.TOP; 
     windowManager.addView(surfaceView, layoutParams); 
     surfaceView.getHolder().addCallback(this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Intent notificationIntent = new Intent(this, MainActivity.class); 

     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
       notificationIntent, 0); 

     Notification notification = new NotificationCompat.Builder(this) 
       //.setSmallIcon(R.mipmap.app_icon) 
       .setContentTitle("Background Video Recorder") 
       .setContentText("") 
       .setContentIntent(pendingIntent).build(); 

     startForeground(MainActivity.NOTIFICATION_ID_RECORDER_SERVICE, notification); 
     return Service.START_NOT_STICKY; 
    } 

    // Method called right after Surface created (initializing and starting MediaRecorder) 
    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     camera = Camera.open(1); 
     mediaRecorder = new MediaRecorder(); 
     camera.unlock(); 

     mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 
     mediaRecorder.setCamera(camera); 
     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_720P)); 

     FileUtil.createDir("/storage/emulated/0/Study/Camera"); 
     mediaRecorder.setOutputFile("/storage/emulated/0/Study/Camera/" + Long.toString(System.currentTimeMillis()) + ".mp4"); 

     try { mediaRecorder.prepare(); } catch (Exception e) {} 
     mediaRecorder.start(); 

     try { 
      camera.setPreviewDisplay(surfaceHolder); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Runnable runnable = new PictureThread(camera); 
     Thread thread = new Thread(runnable); 
     thread.start(); 
    } 

    // Stop recording and remove SurfaceView 
    @Override 
    public void onDestroy() { 
     mediaRecorder.stop(); 
     mediaRecorder.reset(); 
     mediaRecorder.release(); 

     camera.lock(); 
     camera.release(); 

     windowManager.removeView(surfaceView); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {} 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {} 

    @Override 
    public IBinder onBind(Intent intent) { return null; } 
} 

संपादित: मैं अब एक धागा PictureThread लिखा है। यह धागा RecorderService से शुरू हुआ है और वीडियो रिकॉर्डिंग के दौरान एक तस्वीर लेने की कोशिश करता है।

public class PictureThread implements Runnable { 
    private final static String TAG = PictureThread.class.getSimpleName(); 

    private Camera camera; 

    PictureThread(Camera camera) { 
     this.camera = camera; 
    } 

    @Override 
    public void run() { 
     camera.startPreview(); 
     camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
    } 

    Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback() { 
     public void onShutter() { 
     } 
    }; 

    Camera.PictureCallback rawCallback = new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
     } 
    }; 

    Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.i(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 
} 

दुर्भाग्य jpegCallback कभी नहीं कहा जाता हो जाता है (अर्थात लॉग संदेश मुद्रित कभी नहीं है)। जब मैं अपने टैबलेट का कैमरा ऐप खोलता हूं तो मैं वीडियो रिकॉर्डिंग के दौरान चित्र ले सकता हूं, इसलिए यह संभव होना चाहिए।

मैंने एलेक्स कोह्न (https://github.com/mobapptuts/android_camera2_api_video_app) द्वारा सुझाए गए कैमरे 2 एपीआई उदाहरण की भी कोशिश की है। एक वीडियो काम रिकॉर्ड करना और एक तस्वीर भी लेना काम करता है लेकिन जब मैं रिकॉर्डिंग करते समय एक तस्वीर लेने की कोशिश करता हूं, तो कोई चित्र नहीं बनाया जाता है (लेकिन कोई त्रुटि नहीं)। फिर भी, मुझे यह उदाहरण ऐप बहुत विश्वसनीय काम नहीं कर रहा है (शायद एक और उदाहरण ऐप है)।

संपादित 2: shutterCallback और takePicture की rawCallback कहा जाता हो जाता है लेकिन rawCallback का डेटा रिक्त है। jpegCallback कभी नहीं बुलाया जाता है .. कोई विचार क्यों और कैसे हल किया जा सकता है? मैंने बुलाए जाने के लिए कॉलबैक समय देने के लिए थोड़े समय के लिए थ्रेड में इंतजार करने की भी कोशिश की है और मैंने अपनी मुख्य गतिविधि में कॉलबैक को स्थिर करने की कोशिश की है (ताकि यह कचरा एकत्र न हो)। कुछ भी काम नहीं किया।

+0

कच्चे कॉलबैक पर डेटा रिकॉर्डिंग के बिना भी शून्य है। पिछले 10 वर्षों में मुझे एक डिवाइस नहीं मिला जो इस कॉलबैक पर सार्थक डेटा प्रदान करता था। जेपीजी कॉलबैक के लिए, आपको क्या विश्वास है कि इसे काम करना चाहिए? –

+0

@AlexCohn jpegCallback क्यों काम नहीं करना चाहिए? मुझसे कोई गलती हो गई क्य? एंड्रॉइड स्टॉक कैमरा ऐप के साथ मैं रिकॉर्डिंग करते समय चित्र ले सकता हूं इसलिए मुझे विश्वास है कि इसे काम करना चाहिए ... – machinery

+0

वह डिवाइस कौन सा है? –

उत्तर

4

संपादित करें:

वर्ष कैमरा एपीआई takePicture() कॉल करते समय वीडियो रिकॉर्ड किया जा रहा है, डिवाइस है अगर Camera.Parameters.isVideoSnapshotSupported रिपोर्ट पर सच का समर्थन करता है:

स्पष्टीकरण के साथ

सवाल।

बस उसी कैमरे के उदाहरण को दबाएं जिसे आप MediaRecorder में गुजर रहे हैं, और उस पर कैमरा.take चित्र() पर कॉल करें।

कैमरा 2 एक ही समय में पूर्वावलोकन, रिकॉर्डिंग और जेपीईजी आउटपुट के साथ सत्र बनाकर, अधिक लचीलापन के साथ इसका समर्थन करता है।

मूल जवाब:

आप, वापस कैमरा के साथ तस्वीरें लेने का अर्थ यह तो सामने वाला कैमरा के साथ रिकॉर्डिंग करते हुए - कि डिवाइस पर निर्भर है। कुछ उपकरणों में एक साथ कई कैमरे चलाने के लिए पर्याप्त हार्डवेयर संसाधन होते हैं, लेकिन अधिकतर नहीं (वे दो कैमरों के बीच प्रोसेसिंग हार्डवेयर साझा करते हैं)।

एकमात्र तरीका यह बताने का एकमात्र तरीका है कि एक से अधिक कैमरे का उपयोग एक बार किया जा सकता है जब कोई दूसरा कैमरा खोलने का प्रयास करता है। यदि यह काम करता है, तो आपको जाने के लिए अच्छा होना चाहिए; यदि नहीं, तो वह डिवाइस एक साथ कई कैमरों का समर्थन नहीं करता है।

+0

मैं सामने वाले कैमरे से वीडियो रिकॉर्ड करना चाहता हूं और साथ ही फ्रंट कैमरे से तस्वीर लेना चाहता हूं। – machinery

+0

मैंने अपनी मूल पोस्ट में एक संपादन किया है। Camera.takePicture() का उपयोग करना काम नहीं किया है, हालांकि रिकॉर्डिंग करते समय मेरा डिवाइस चित्रों को कैप्चर करने में सक्षम होना चाहिए। – machinery

1

नहीं, आप वीडियो रिकॉर्डिंग और अभी भी कैप्चर करने के लिए अलग-अलग कैमरा उदाहरण नहीं खोल सकते हैं। बहिष्कृत कैमरा एपीआई ऐसे कार्यों के लिए विश्वसनीय नहीं है (उदाहरण के लिए Android camera parameter IsVideoSnapshotSupported incorrectly set to false सैमसंग एस 4 के बारे में देखें)।

आप उसी कैमरे के उदाहरण से विभिन्न प्रारूपों और संकल्पों को कैप्चर करने के लिए कैमरा 2 एपीआई (ऐसे मोड का समर्थन करने वाले उपकरणों पर) का उपयोग कर सकते हैं। यहाँ एक वीडियो ट्यूटोरियल है: https://www.nigeapptuts.com/android-video-app-still-capture-recording/

+0

कैमरा 2 एपीआई दिलचस्प लगता है। अगर मैं आपको सही ढंग से समझता हूं, तो मैं एक कैमरा उदाहरण बना सकता हूं और फिर इस उदाहरण का उपयोग फ्रंट कैमरे से वीडियो रिकॉर्डिंग और साथ ही फ्रंट कैमरे से चित्र ले सकता हूं। क्या आप कुछ कोड उदाहरण प्रदान कर सकते हैं कि यह कैसे प्राप्त किया जा सकता है? ये तो बहुत अच्छा रहेगा। – machinery

+0

https://www.nigeapptuts.com/android-video-app-still-capture-recording/ –

+0

मैंने अपने नए दृष्टिकोण के साथ अपनी मूल पोस्ट में एक संपादन किया है। – machinery

संबंधित मुद्दे