# ऑडियो और समय सीमा के साथ वीडियो कैसे रिकॉर्ड करें

> वीडियो रिकॉर्ड करें (ऑडियो के साथ या बिना), गुणवत्ता और अवधि सीमा निर्धारित करें, और MP4 का पथ प्राप्त करें।

Source: https://crossfly.dev/hi/docs/cookbook/device/gravar-video — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# ऑडियो और समय सीमा के साथ वीडियो कैसे रिकॉर्ड करें

**उद्देश्य।** डिवाइस के कैमरे से एक वीडियो रिकॉर्ड करना, वैकल्पिक रूप से **ऑडियो के साथ**, अवधि को
सीमित करते हुए और गुणवत्ता चुनते हुए, और **`.mp4` फ़ाइल का पथ** प्राप्त करना।

## उपयोग की गई APIs
- `Camera.captureMode` (`Preview`) — कैप्चर मोड: `PHOTO`, `MUTED_VIDEO` (बिना आवाज़ का वीडियो), `AUDIO_VIDEO` (वीडियो + ऑडियो)।
- `Camera.videoTimeLimit` (`int`) — रिकॉर्डिंग की सीमा **सेकंड में**; `0` = कोई सीमा नहीं।
- `Camera.videoQuality` (`AVQuality`) — `HIGH`, `MEDIUM` (`Camera` का डिफ़ॉल्ट), `LOW`। प्रत्येक मान fps, वीडियो/ऑडियो दर और स्टीरियो परिभाषित करता है।
- `Camera.shot()` → `String` — रिकॉर्डिंग UI शुरू करता है और `.mp4` का पथ लौटाता है (या `null`)।
- `PhotoPicker(Preview type)` — जब `cameraType == PICKER` हो तब उपयोग की जाने वाली UI; इसमें सार्वजनिक फ़ील्ड `videoTimeLimit` और `videoQuality` हैं जिन्हें `shot()` पहले से ही `Camera` से भर देता है।

> **नोट।** `PhotoPicker` में, वीडियो रिकॉर्ड करते समय, फ़ाइल `/sdcard/<timestamp>.mp4` में सहेजी जाती है।
> `videoTimeLimit` picker के समय लेबल को **उलटी गिनती** करने पर मजबूर करता है। `AUDIO_VIDEO` में
> रिकॉर्डिंग में ऑडियो शामिल होता है (`GdxRecorder.startVideoWithAudio`), `MUTED_VIDEO` में नहीं।
> वीडियो मोड वाले iOS में, `shot()` OS के मूल कैमरे का उपयोग करते हुए `videoTimeLimit`/`videoQuality` पास करता है।

## पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)

```java
package com.exemplo;

import dev.crossfly.ui.*;                   // Window, Component, Button, Label, UIConstants
import dev.crossfly.ui.layout.*;            // VerticalLayout
import dev.crossfly.device.*;               // Camera, Camera.AVQuality

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Label resultado = new Label("");
      add(LAY_AUTO, resultado);

      Button acao = new Button("Gravar vídeo");
      acao.onAction(c ->
      {
         new Thread(() ->
         {
            Camera cam = new Camera();
            cam.cameraType     = UIConstants.CameraType.PICKER;     // CrossFly की रिकॉर्डिंग UI
            cam.captureMode    = UIConstants.Preview.AUDIO_VIDEO;   // ऑडियो सहित वीडियो (बिना आवाज़ के लिए MUTED_VIDEO का उपयोग करें)
            cam.videoQuality   = Camera.AVQuality.HIGH;             // HIGH | MEDIUM | LOW
            cam.videoTimeLimit = 30;                                // 30s; 0 = कोई सीमा नहीं

            String mp4 = cam.shot();                                // .mp4 का पाथ, या रद्द होने पर null

            Component.onUI(() ->                                    // paint thread के बाहर लौटता है
               resultado.setText(mp4 != null ? "Vídeo: " + mp4 : "Cancelado"));
         }).start();
      });
      add(LAY_AUTO, acao);
   }
}
```

> नीचे का अंश **केवल मुख्य भाग** दिखाता है। चलाने के लिए, इसे ऊपर दिए गए `MainWindow` ढाँचे में रखें।

## न्यूनतम अंश

```java
// स्रोत में सत्यापित: Camera.java (captureMode/videoTimeLimit/videoQuality, shot()); PhotoPicker.java (startRecording, stopRecording)
import dev.crossfly.device.*;              // Camera, Camera.AVQuality
import dev.crossfly.ui.*;                  // Component, UIConstants.CameraType/Preview

new Thread(() -> {
   Camera cam = new Camera();
   cam.cameraType    = UIConstants.CameraType.PICKER;     // CrossFly की रिकॉर्डिंग UI
   cam.captureMode   = UIConstants.Preview.AUDIO_VIDEO;   // ऑडियो सहित वीडियो (बिना आवाज़ के लिए MUTED_VIDEO का उपयोग करें)
   cam.videoQuality  = Camera.AVQuality.HIGH;             // HIGH | MEDIUM | LOW
   cam.videoTimeLimit = 30;                               // 30s; 0 = कोई सीमा नहीं

   String mp4 = cam.shot();                               // .mp4 का पाथ, या रद्द होने पर null

   Component.onUI(() -> {                                 // paint thread के बाहर लौटता है
      if (mp4 != null)
         usarVideo(mp4);
   });
}).start();
```

## और गहराई में जाएँ
- कैमरा गाइड: [डिवाइस का कैमरा](/docs/data-and-services/device-camera) · Widget: [PhotoPicker](/docs/ui/widgets/photopicker)
- संबंधित रेसिपी: [tirar-foto.md](/docs/cookbook/device/tirar-foto)
