2016-12-12 16 views
10

मैं, कैमरे के साथ एक वीडियो रिकॉर्डिंग कर रहा हूँ MediaRecorder वर्ग का उपयोग कर रिकॉर्डिंग, इसएंड्रॉयड - मूक माइक्रोफोन, जबकि वीडियो

http://androidcookbook.com/Recipe.seam;jsessionid=40151FCD26222877E151C3EEFB406EED?recipeId=1375&recipeFrom=ViewTOC

करने के लिए एक ट्यूटोरियल समान पालन करने के बाद और मैं चाहता हूँ, जबकि रिकॉर्डिंग, सक्षम होने के लिए माइक्रोफोन को म्यूट/अनम्यूट करने के लिए। यह कैसे संभव है?

मैं कुछ बिंदु पर शुरू

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

लेकिन क्या मैं रिकॉर्ड करना चाहते हैं, तो पर ऑडियो स्रोत सेट कर रहा हूं ध्वनि के बिना?

+0

AudioManager.setMicrophoneMute (बुलियन) आप के लिए काम नहीं करता है? – Gil

+0

@ गिल नं। नोट 4 पर काम नहीं कर रहा है। –

+0

@ बोल्डिजरपॉल ** किसी भी समय ध्वनि के बिना रिकॉर्ड? ** तो आप 6 से 10 म्यूट वीडियो से ध्वनि के साथ पहले 5 सेकंड की तरह चाहते हैं? – user1140237

उत्तर

2

निम्नलिखित कोड का प्रयास करें:

private void setMicMuted(boolean state){ 
    AudioManager myAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); 

    // get the working mode and keep it 
    int workingAudioMode = myAudioManager.getMode(); 

    myAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); 

    // change mic state only if needed 
    if (myAudioManager.isMicrophoneMute() != state) { 
     myAudioManager.setMicrophoneMute(state); 
    } 

    // set back the original working mode 
    myAudioManager.setMode(workingAudioMode); 
} 
+0

यह मेरे लिए काम करता है। सैमसंग नोट 4 और एचटीसी एम 8 पर परीक्षण किया गया –

0
((AudioManager)context.getSystemService(Context.AUDIO_SERVICE)).setStreamMute(AudioManager.STREAM_SYSTEM,true); 

कोशिश करें, यह सभी ध्वनियों को म्यूट करें।

2

और इसके बिना अगर न आवश्यक ध्वनि ध्वनि (MIC) या mediaRecorder में AudioSource साथ ध्वनि के बिना (MIC) रिकॉर्ड वीडियो क्लिप के साथ वीडियो को संभालने के लिए। mp4 parser का उपयोग कर सभी क्लिप मर्ज करें।

ऑडियो स्रोत और ऑडियोइन्कोडर के साथ वीडियो रिकॉर्ड करने के लिए कैमरा पैरामीटर प्राप्त करने, प्रोफाइल लाने और MediaRecorder पर पैरामीटर सेट करने के लिए आवश्यक है।

यहां मैंने कोड दिया है जो ध्वनि के साथ और ध्वनि के बिना वीडियो रिकॉर्ड करने में मदद कर सकता है (वीडियो रिकॉर्डिंग हो सकती है क्योंकि मैंने आपके प्रश्न में गवेन लिंक से लिया है लेकिन म्यूट और अनम्यूट ठीक काम करेगा)

गतिविधि

import android.app.Activity; 
import android.hardware.Camera; 
import android.media.CamcorderProfile; 
import android.media.MediaRecorder; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.Surface; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 
import android.widget.ToggleButton; 

import com.googlecode.mp4parser.BasicContainer; 
import com.googlecode.mp4parser.authoring.Movie; 
import com.googlecode.mp4parser.authoring.Track; 
import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder; 
import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator; 
import com.googlecode.mp4parser.authoring.tracks.AppendTrack; 

import java.io.File; 
import java.io.IOException; 
import java.io.RandomAccessFile; 
import java.nio.channels.WritableByteChannel; 
import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 

public class MediaRecorderRecipe extends Activity implements SurfaceHolder.Callback { 
    private MediaRecorder mMediaRecorder; 
    private Camera mCamera; 
    private SurfaceView mSurfaceView; 
    private SurfaceHolder mHolder; 
    private View mToggleButton; 
    private ToggleButton togglemute; 
    private boolean mInitSuccesful; 
    private File videoDirectory; 
    private Button btn; 
    private File mainDirectory, clipsDir, mergedDir; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test); 
     videoDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "MuteUnMuteVideos"); 
     clipsDir = new File(videoDirectory.getAbsolutePath(), "Clips"); 
     clipsDir.mkdirs(); 
     mergedDir = new File(videoDirectory.getAbsolutePath(), "FinalMerged"); 
     mergedDir.mkdirs(); 
     deleteFilesDir(clipsDir.getAbsolutePath()); 
     // we shall take the video in landscape orientation 

     mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView); 
     mHolder = mSurfaceView.getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     togglemute = (ToggleButton) findViewById(R.id.togglemute); 
     mToggleButton = (ToggleButton) findViewById(R.id.toggleRecordingButton); 
     btn = (Button) findViewById(R.id.doneRecording); 
     mToggleButton.setOnClickListener(new OnClickListener() { 
      @Override 
      // toggle video recording 
      public void onClick(View v) { 

       if (((ToggleButton) v).isChecked()) { 
        try { 
         if (!mInitSuccesful) 
          initRecorder(mHolder.getSurface()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        mMediaRecorder.start(); 
        togglemute.setEnabled(false); 
        btn.setEnabled(false); 
       } else { 
        mMediaRecorder.stop(); 
        mMediaRecorder.reset(); 
        togglemute.setEnabled(true); 
        btn.setEnabled(true); 
        mInitSuccesful = false; 

       } 
      } 
     }); 
     btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       new MergeVideosTask(MediaRecorderRecipe.this).execute(); 
      } 
     }); 

    } 

    private File outputFile; 

    class MergeVideosTask extends AsyncTask { 
     Activity activity; 

     public MergeVideosTask(Activity activity) { 
      this.activity = activity; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      /** 
      * Show Progressbar 
      */ 
     } 

     @Override 
     protected Object doInBackground(Object[] objects) { 
      mergeVideos(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Object o) { 
      super.onPostExecute(o); 
      /** 
      * Dismiss Progress 
      */ 
      Toast.makeText(MediaRecorderRecipe.this, "Save Video : " + outputFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); 
     } 

     public void mergeVideos() { 
      try { 
       File parentDir = new File(clipsDir.getAbsolutePath()); 
       List<String> videosPathList = new ArrayList<>(); 
       File[] files = parentDir.listFiles(); 
       for (File file : files) { 
        videosPathList.add(file.getAbsolutePath()); 
       } 

       List<Movie> inMovies = new ArrayList<>(); 
       for (int i = 0; i < videosPathList.size(); i++) { 
        String filePath = videosPathList.get(i); 
        try { 
         Movie movie = MovieCreator.build(filePath); 
         if (movie != null) 
          inMovies.add(movie); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
       List<Track> videoTracks = new LinkedList<Track>(); 
       List<Track> audioTracks = new LinkedList<Track>(); 
       for (Movie m : inMovies) { 
        for (Track t : m.getTracks()) { 
         try { 
          if (t.getHandler().equals("soun")) { 
           audioTracks.add(t); 
          } 
          if (t.getHandler().equals("vide")) { 
           videoTracks.add(t); 
          } 
         } catch (Exception e) { 

         } 
        } 
       } 
       Movie result = new Movie(); 
       if (audioTracks.size() > 0) { 
        result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()]))); 
       } 
       if (videoTracks.size() > 0) { 
        result.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()]))); 
       } 
       BasicContainer out = (BasicContainer) new DefaultMp4Builder().build(result); 
       File f = null; 
       String finalVideoPath; 
       try { 
        f = setUpVideoFile(mergedDir.getAbsolutePath()); 
        finalVideoPath = f.getAbsolutePath(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
        f = null; 
        finalVideoPath = null; 
       } 
       WritableByteChannel fc = new RandomAccessFile(finalVideoPath, "rw").getChannel(); 
       out.writeContainer(fc); 
       fc.close(); 
       outputFile = new File(finalVideoPath); 
//    deleteFilesDir(getExternalFilesDir(null).getAbsolutePath()); 

      } catch (Exception e) { 
       e.printStackTrace(); 

       finish(); 
      } 
     } 

     File setUpVideoFile(String directory) throws IOException { 
      File videoFile = null; 
      if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { 
       File storageDir = new File(directory); 
       if (storageDir != null) { 
        if (!storageDir.mkdirs()) { 
         if (!storageDir.exists()) { 
          Log.d("CameraSample", "failed to create directory"); 
          return null; 
         } 
        } 
       } 
       videoFile = File.createTempFile("video_" + System.currentTimeMillis() + "_", ".mp4", storageDir); 
      } 
      return videoFile; 
     } 


    } 

    private void deleteFilesDir(String path) { 
     File dir = new File(path); 
     if (dir.isDirectory()) { 
      String[] children = dir.list(); 
      for (int i = 0; i < children.length; i++) { 
       new File(dir, children[i]).delete(); 
      } 
     } 
    } 

    /* Init the MediaRecorder, the order the methods are called is vital to 
    * its correct functioning */ 
    private void initRecorder(Surface surface) throws IOException { 
     // It is very important to unlock the camera before doing setCamera 
     // or it will results in a black preview 
     if (mCamera == null) { 
      mCamera = Camera.open(); 
     } 
     if (mMediaRecorder != null) { 
      mMediaRecorder.reset(); // clear recorder configuration 
      mMediaRecorder.release(); // release the recorder object 
      mMediaRecorder = null; 
     } 
     mMediaRecorder = new MediaRecorder(); 
     mMediaRecorder.setPreviewDisplay(surface); 


     CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P); 
     Camera.Parameters parameters = mCamera.getParameters(); 
     List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); 
     List<Camera.Size> mSupportedVideoSizes = parameters.getSupportedVideoSizes(); 
     Camera.Size optimalSize = getOptimalVideoSize(mSupportedVideoSizes, 
       mSupportedPreviewSizes, profile.videoFrameWidth, profile.videoFrameHeight); 
     /** 
     * Prepare video with proper size. Preview and video size 
     */ 
     profile.videoFrameWidth = optimalSize.width; 
     profile.videoFrameHeight = optimalSize.height; 
     mCamera.unlock(); 
     mMediaRecorder.setCamera(mCamera); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     if (!togglemute.isChecked()) { 
      /** 
      * Add Audio Source if video required with sound 
      */ 
      mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 

     } 
     mMediaRecorder.setOutputFormat(profile.fileFormat); 
     mMediaRecorder.setVideoEncoder(profile.videoCodec); 
     if (!togglemute.isChecked()) { 
      /** 
      * Add Audio Encoder if video required with sound 
      */ 
      mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
     } 
     mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); 
     mMediaRecorder.setVideoFrameRate(profile.videoFrameRate); 
     mMediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); 
     File file = new File(clipsDir.getAbsolutePath(), System.currentTimeMillis() + ".mp4"); 
     // "touch" the file 
     if (!file.exists()) { 
      File parent = file.getParentFile(); 
      if (parent != null) 
       if (!parent.exists()) 
        if (!parent.mkdirs()) 
         throw new IOException("Cannot create " + 
           "parent directories for file: " + file); 

      file.createNewFile(); 
     } 

     mMediaRecorder.setOutputFile(file.getAbsolutePath()); 
     mMediaRecorder.setPreviewDisplay(surface); 

     try { 
      mMediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      // This is thrown if the previous calls are not called with the 
      // proper order 
      e.printStackTrace(); 
     } 

     mInitSuccesful = true; 
    } 

    public static Camera.Size getOptimalVideoSize(List<Camera.Size> supportedVideoSizes, 
                List<Camera.Size> previewSizes, int w, int h) { 
     // Use a very small tolerance because we want an exact match. 
     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio = (double) w/h; 

     // Supported video sizes list might be null, it means that we are allowed to use the preview 
     // sizes 
     List<Camera.Size> videoSizes; 
     if (supportedVideoSizes != null) { 
      videoSizes = supportedVideoSizes; 
     } else { 
      videoSizes = previewSizes; 
     } 
     Camera.Size optimalSize = null; 

     // Start with max value and refine as we iterate over available video sizes. This is the 
     // minimum difference between view and camera height. 
     double minDiff = Double.MAX_VALUE; 

     // Target view height 
     int targetHeight = h; 

     for (Camera.Size size : videoSizes) { 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) 
       continue; 
      if (Math.abs(size.height - targetHeight) < minDiff && previewSizes.contains(size)) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Camera.Size size : videoSizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff && previewSizes.contains(size)) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      if (!mInitSuccesful) 
       initRecorder(mHolder.getSurface()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     shutdown(); 
    } 

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


    private void shutdown() { 
     // Release MediaRecorder and especially the Camera as it's a shared 
     // object that can be used by other applications 
     mMediaRecorder.reset(); 
     mMediaRecorder.release(); 
     mCamera.release(); 

     // once the objects have been released they can't be reused 
     mMediaRecorder = null; 
     mCamera = null; 
    } 
} 

लेआउट

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <ToggleButton 
     android:id="@+id/toggleRecordingButton" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textOff="Start Recording" 
     android:textOn="Stop Recording" /> 
    <ToggleButton 
     android:id="@+id/togglemute" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textOff="Mute Recording" 
     android:textOn="UnMute Recording" /> 

    <Button 
     android:id="@+id/doneRecording" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Finish Recording" /> 

    <FrameLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <SurfaceView 
      android:id="@+id/surfaceView" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"></SurfaceView> 

    </FrameLayout> 
</LinearLayout> 

build.gradle

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.1.1' 
    compile 'com.android.support:design:23.1.1' 
    compile 'com.googlecode.mp4parser:isoparser:1.1.21' ///To MergeVideos 
} 

शुरू रिकॉर्डिंग से पहले हर बार नया MediaRecorder उदाहरण बनाने की आवश्यकता है। और रिकोडिंग स्टॉप के बाद रिलीज़ करें।

यदि वीडियो ध्वनि (माइक्रो) के साथ आवश्यक है तो नीचे दिए गए अनुसार MediaRecorder में ऑडियो स्रोत और ऑडियो एन्कोडर जोड़ें।

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 

के रूप में मैं ज्यादा नहीं समय है तो वीडियो streching हिस्सा लेकिन म्यूट करें/अनम्यूट अपने प्रश्न के अनुसार कार्य करेंगे दूर करने के लिए उचित कोड नहीं hve।

वीडियो रिकॉर्डिंग के लिए

refere कृपया this

मुझे पता है अगर कुछ भी

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