标签: android-mediarecorder

如何在三星设备android上录制特定宽度和高度的视频?

您好我正在制作一个Android应用程序,其中我使用自定义相机记录相机.我在三星设备上有问题.我无法将媒体记录器的配置文件设置为 CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_HIGH)

也试着用

profile = CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_LOW);
                       profile.videoFrameHeight=360;
                       profile.videoFrameWidth=640;
Run Code Online (Sandbox Code Playgroud)

然后我的应用程序正在一些设备上工作,但在许多设备上崩溃.任何类型的帮助将是可感知的.谢谢提前请检查代码

Camera.Parameters param = mCamera.getParameters();
            param.set( "cam_mode", 1 );  
         // Enable video stabilization. Convenience methods not available in API
            // level <= 14
            String vstabSupported = param.get("video-stabilization-supported");
            if ("true".equals(vstabSupported)) {
                param.set("video-stabilization", "true");
            }
            List<Size> sizes = mCamera.getParameters() .getSupportedVideoSizes();
            mCamera.setParameters( param );
            mMediaRecorder = new MediaRecorder();
            // Step 1: Unlock and set camera to MediaRecorder
            mCamera.unlock();
            mMediaRecorder.setCamera(mCamera);
            mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
            // Step 2: Set sources
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            String deviceMan = android.os.Build.MANUFACTURER;
            Toast.makeText(getApplicationContext(), deviceMan, …
Run Code Online (Sandbox Code Playgroud)

android samsung-mobile android-mediarecorder

15
推荐指数
1
解决办法
8492
查看次数

MediaRecorder启动失败:-38

我搜索检查这个问题是否没有重复,我看到一些没有答案,其他人没有帮助.

这是我的代码:

private void startRecording()
{
            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

            mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
              mFileName += "/recordedHeckPost_.3gp";

            mRecorder.setOutputFile(mFileName);                  

                try {
                    mRecorder.prepare();
                    //Thread.sleep(2000);
                    mRecorder.start();                  
        }
                catch (InterruptedException e) 
                {   // TODO Auto-generated catch block
            e.printStackTrace();
        }     
            catch(IllegalStateException e)
            {
                e.printStackTrace();
            } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

private void stopRecording()
{
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
}
Run Code Online (Sandbox Code Playgroud)

运行此代码后(On Nexus 5)我得到以下启动失败-38异常:

05-31 18:17:39.404: E/MediaRecorder(2464): start failed: -38
05-31 18:17:39.404: W/System.err(2464): java.lang.IllegalStateException
05-31 …
Run Code Online (Sandbox Code Playgroud)

android mediarecorder android-mediarecorder

15
推荐指数
1
解决办法
8916
查看次数

Android Media Recorder不会在Google Glass上录制长视频

我已经为Google Glass 编写了一个开源摄像头,但是一些使用它的人报告说,录制的视频无法正常保存用于冗长的视频.

我找不到有关Android文档中任何此类限制的信息

因此,在检查出来之后,我发现对于大于26 minutes的视频,视频文件保存在Glass中,其大小已经存在,2.7 GB但其持续时间是0:00.它无法使用任何视频播放器播放.

所以我想知道为什么会这样?为什么视频会被正确录制duration < 26 minutes并被搞砸为更长的视频.

启动视频录制的代码是

/**
 * Initialize video recorder to record video
 */
private void initRecorder() {
    try {
        File dir = new File(Environment.getExternalStorageDirectory()
                + File.separator + Environment.DIRECTORY_PICTURES
                + File.separator + "My Videos");
        if (!dir.exists()) {
            dir.mkdirs();
        }
        videofile = new File(dir, "video.mp4");
        recorder.setCamera(mCamera);

        // Step 2: Set sources
        recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        // Step 3: Set a CamcorderProfile (requires API Level 8 or …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-mediarecorder google-glass google-glass-camera

14
推荐指数
1
解决办法
396
查看次数

流Android屏幕

我试图让Truiton ScreenCapture示例,以便使用MediaProjection记录设备屏幕

保存录音时,它可以正常工作

    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    String localFilePath = getLocalFilePath();
    mMediaRecorder.setOutputFile(localFilePath);

    mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.prepare();
Run Code Online (Sandbox Code Playgroud)

然而,当改变使用FileDescriptor时,它不是

    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    String hostname = "10.26.100.18";
    int port = 2007;
    Socket socket = new Socket(InetAddress.getByName(hostname), port);
    ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.fromSocket(socket);
    LocalServerSocket localServerSocket = new LocalServerSocket(fileDescriptor.getFileDescriptor());

    mMediaRecorder.setOutputFile(localServerSocket.getFileDescriptor());

    mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.prepare();
Run Code Online (Sandbox Code Playgroud)

如果没有使用LocalServerSocket,那么mMediaRecorder.prepare()抛出异常,现在我正在使用它,在下面的方法中得到异常mMediaRecorder.getSurface()

private VirtualDisplay createVirtualDisplay() {
    return mMediaProjection.createVirtualDisplay("MainActivity",
            DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity,
            DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
            mMediaRecorder.getSurface(), null /*Callbacks*/, null
            /*Handler*/);
}
Run Code Online (Sandbox Code Playgroud)

例外

Caused by: java.lang.IllegalStateException: failed to get surface
   at …
Run Code Online (Sandbox Code Playgroud)

java android android-mediarecorder android-mediaprojection

14
推荐指数
1
解决办法
2671
查看次数

Android捕捉慢动作视频

如何在我的应用中捕捉慢动作视频?

我试过用

 mMediaRecorder.setVideoFrameRate(100);
Run Code Online (Sandbox Code Playgroud)

但如果我将值设置为20或更多,应用程序崩溃IllegalStateException.

我已经研究了很多.正常视频在24到30 fps之间.要看慢动作视频,我们需要捕获100-120 fps,但设备不允许这样.但是我看到设备中的默认摄像头有一个慢动作选项.游戏商店中的应用程序也很少允许创建慢动作视频.我也尝试设置更高setCaptureRate(),但也可以拍摄普通模式视频.在少数几个地方提到慢动作电影可以通过OpenCV/JavaCV图书馆完成,但我不明白如何使用这些库来捕获android中的慢动作视频?

android android-camera android-mediarecorder slowmotion

13
推荐指数
2
解决办法
4986
查看次数

媒体录音机录制电话有时无法录制其他侧面语音

在我的应用程序中,有一个功能来记录语音呼叫,它的工作非常好.但是当测试(三星s7,s8)它不能很好地工作.该应用程序只能记录来电者的声音而不是另一端的声音.以下是我的代码检查请建议解决方案

MediaRecd = new MediaRecorder();
            MediaRecd.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL
            );

            MediaRecd.setAudioChannels(ConstantVariables.audioChannels);//monoRecording

   MediaRecd.setAudioEncodingBitRate(64);
            MediaRecd.setAudioSamplingRate(44100);


            MediaRecd.setOutputFormat(output_formats[pos]);//.mp3
            MediaRecd.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//I already try with all possible CAMCORDER , MIC , Default etc etc but none was working
            MediaRecd.setOutputFile(Currentfilename);

            try {
                MediaRecd.prepare();
                MediaRecd.start();


            } catch (Exception e) {
                MediaRecd.reset();
                MediaRecd.release();
                MediaRecd = null;

            }
Run Code Online (Sandbox Code Playgroud)

请帮忙

android phone-call android-mediarecorder android-phone-call

13
推荐指数
1
解决办法
2760
查看次数

从Android Media Recorder流式传输后修复3GP文件

我试图通过本地unix socket从android摄像头流式传输视频,并将文件从流写入sdcard.一切正常,除了文件不能播放任何播放器.这是因为Android没有填补文件中的一些空白,因为socket不可寻找.据我所知,我需要在视频流结束后进行一些修改.我在这里,这里这里读过几篇文章,但没有一篇能帮到我.我正在使用十六进制编辑器来学习如何手动完成它,所以之后在Android代码中执行相同操作将是微不足道的.

以下是从流中保存的示例文件:https://dl.dropbox.com/u/17510473/sample_not_playable.3gp

任何人都可以修复它使它可玩并告诉他是如何做到的?

编辑:我擦除3gp文件的标题,并编写新的文件,如下所示:

00 00 00 18 66 74 79 70 33 67 70 34 00 00 03 00 33 67 70 34 33 67 70 36 00 00 00 00
Run Code Online (Sandbox Code Playgroud)

然后我用以下命令找到mdat和moov原子的起始位置:

grep -aobE "ftyp|mdat|moov" sample_not_playable.3gp
Run Code Online (Sandbox Code Playgroud)

它给了我以下输出:

4:ftyp
28:mdat
1414676:moov
Run Code Online (Sandbox Code Playgroud)

然后做 1414676 - 28 = 1,414,648 = 0x1595F8

然后我写0x1595F8为25-28字节,就在mdat原子之前.所以我的标题现在看起来像这样:

00 00 00 18 66 74 79 70 33 67 70 34 00 00 03 00 33 67 70 …
Run Code Online (Sandbox Code Playgroud)

video android 3gp video-streaming android-mediarecorder

12
推荐指数
1
解决办法
7661
查看次数

如何在Android中录制质量更好的音频文件?

我正在创建一个应用程序,它将Android上的录制文件播放到iphone,反之亦然.

现在我在用,

        audioRecorder = new MediaRecorder();
        audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
Run Code Online (Sandbox Code Playgroud)

使用此代码记录的文件大小为85 kb/15秒,质量非常差.

如果我使用,

        audioRecorder = new MediaRecorder();
        audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
        audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Run Code Online (Sandbox Code Playgroud)

然后文件大小是25kb/15秒,质量比aac好得多.但问题是AMR在iPhone中无法播放.

因此,请建议Android的录制架构具有更好的质量,实惠的尺寸,也可以在iPhone上播放.

android aac android-mediarecorder android-audiorecord

12
推荐指数
2
解决办法
1万
查看次数

android mediaprojection截图包含黑框

我正在使用MediaProjection录制我的屏幕,如下所示

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
displayWidth = size.x;
displayHeight = size.y;

imageReader = ImageReader.newInstance(displayWidth, displayHeight, ImageFormat.JPEG, 5);

int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;

DisplayMetrics metrics = getResources().getDisplayMetrics();
int density = metrics.densityDpi;

mediaProjection.createVirtualDisplay("test", displayWidth, displayHeight, density, flags, 
      imageReader.getSurface(), null, projectionHandler);

Image image = imageReader.acquireLatestImage();
byte[] data = getDataFromImage(image);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Run Code Online (Sandbox Code Playgroud)

问题是捕获的图像包含如下图像的黑框.

在此输入图像描述

编辑

上述问题可以通过位图操作来解决.

不过,我现在正在寻找可以应用到解决方案MediaProjectionSurfaceViewImageReader实现设备记录.

android android-mediarecorder android-mediaprojection

11
推荐指数
3
解决办法
1778
查看次数

MediaRecorder替代Oreo之前的setNextOutputFile?

我在Oreo之前使用MediaRecorder API.我面临的问题是如果录制持续1或2小时,则录制发生在一个连续的大文件上.

由于Oreo(API级别26)MediaRecorder API引入了setNextOutputFile(),这对于记录多个文件而不会丢失数据非常有用.这些文件可以配置为小尺寸,这样在处理时它们不会占用大量的应用程序内存.

我的计划是以下列方式使用它们:

File current;
File nextFile;
// Code to initialize/create these file instances
.
.
.
// Code to initialize/create MediaRecorder insatance which will be in try catch
mRecorder.setOutputFile(currentFileName);
mRecorder.prepare();
mRecorder.setNextOutputFile(nextFile);
.
.
mRecorder.start();
.
.
mRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
      @Override
      public void onInfo(MediaRecorder mr, int infoCode, int extra) {
         Log.e(TAG, "Media recorder info : " + infoCode);
         if (infoCode == MediaRecorder.MEDIA_RECORDER_INFO_NEXT_OUTPUT_FILE_STARTED) {
         String path = getNewUniquePath();
         File nextFile = new File(path); 
         mRecorder.setNextOutputFile(nextFile);
      }
   } …
Run Code Online (Sandbox Code Playgroud)

android mediarecorder android-mediarecorder android-support-library

11
推荐指数
0
解决办法
689
查看次数