标签: android-mediarecorder

Android使用CamcorderProfile捕获慢动作视频

我想在我的Nexus 5x上捕捉慢动作视频.这就是我配置媒体记录器的方式:

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH_SPEED_HIGH);

mMediaRecorder = new MediaRecorder();

// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);

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

// Step 3: Set the high speed CamcorderProfile
mMediaRecorder.setProfile(profile);

// Step 4: Set output file
// Step 5: Prepare media recorder
// Step 6: Capture video
Run Code Online (Sandbox Code Playgroud)

问题是,捕获的视频不是我的设备支持的120 fps慢动作视频.它们是常规的29 fps视频.

我通过了这个答案,在官方文档中讨论了以下内容:

对于下面定义的所有高速配置文件((从QUALITY_HIGH_SPEED_LOW到QUALITY_HIGH_SPEED_2160P),它们与正常录制配置文件类似,只有更高的输出帧速率和比特率.因此,使用setProfile(CamcorderProfile)设置这些配置文件而不指定任何其他编码参数将生成高速视频,而不是具有不同捕获和输出(回放)帧速率的慢动作视频. 要记录慢动作视频,应用程序必须通过setVideoFrameRate(int)和setVideoEncodingBitRate适当地设置视频输出(回放)帧速率和比特率. (int)基于慢动作因子.如果应用程序打算使用MediaCodec编码器进行视频录制,则必须根据此CamcorderProfile类似地设置MediaFormat的每个单独字段.

我没有得到的是,setProfile已经使用从所选CamcorderProfile派生的参数调用了两个方法setVideoFrameRate和setVideoEncodingBitRate.为什么我需要再打电话给他们?我在这里错过了什么?

任何帮助将不胜感激.对于我的生活,我不能让这个工作!

编辑:我试过调用这样的方法,但它仍然捕获正常速度的视频:

mMediaRecorder.setVideoFrameRate(profile.videoFrameRate/4); 
mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate/4);
Run Code Online (Sandbox Code Playgroud)

1/4因为由CamcorderProfile.QUALITY_HIGH_SPEED_HIGH通告的帧速率是120,我想拍摄30 fps视频的文件中所述这里 …

android android-camera android-mediarecorder slowmotion

10
推荐指数
1
解决办法
1108
查看次数

MediaRecorder在启动时崩溃

我搜索了很多主题,但没有直接回答.

我有这个代码:

        recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

    recorder.setOutputFile(mFileName);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    if(!mStartRecording)
    {
        btn.setText("Stop Recording");
        try {
            recorder.prepare();

        }  catch (IOException e) {
            e.printStackTrace();
        }
        recorder.start();
        mStartRecording = true;
    }
    else
    {
        btn.setText("Start Recording");
        mStartRecording = false;
        recorder.stop();
        recorder.reset();
        recorder.release();

        recorder = null;
    }
Run Code Online (Sandbox Code Playgroud)

我补充说:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Run Code Online (Sandbox Code Playgroud)

(看到添加STORAGE的地方解决了它,对我没有好处)

我在API Level 7(Android 2.1)上开发

堆栈跟踪说"启动faild"堆栈跟踪:

    04-26 19:27:41.955: D/dalvikvm(890): GC freed 809 objects / 58272 bytes in 433ms
04-26 19:27:44.772: D/dalvikvm(890): GC freed 95 objects / 3936 …
Run Code Online (Sandbox Code Playgroud)

android android-emulator mediarecorder android-mediarecorder

9
推荐指数
1
解决办法
3万
查看次数

Android录制没有音频的视频

Android中是否可以在没有音频流的情况下录制来自Camera的视频?

目标:减少输出文件大小.

android android-camera mediarecorder android-mediarecorder

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

setOrientationHint在某些手机的前置摄像头(HTC)上逆时针旋转视频

问题:某些Android设备(在问题的底部列出)在使用setOrientationHint(int degrees)前置摄像头拍摄的视频功能时会出现意外行为.预期的行为是视频顺时针旋转,但这些设备逆时针旋转视频.

我的目标:在摄像机设置或硬件方向内识别变量,使我能够预测何时会发生这种情况.具体来说,我想避免在我的代码中特别包装这些​​手机!

进一步说明:我正在使用标准MediaRecorder对象录制视频,在准备录制时,我使用了设置视频的方向setOrientationHint().在文档中setOrientationHint(),为degrees参数指定了以下内容:

degrees - 以度为单位顺时针旋转的角度.支持的角度为0°,90°,180°和270°.

该功能旨在添加包含旋转角度的合成矩阵,以便视频播放器可以按预期显示视频.所以,我所做的是使用CameraInfo类获取相机硬件的方向,并将其用作fn中的degrees参数setOrientationHint.(我已尝试使用AOSP作为指南对此代码进行修改,但我的结果完全相同.)

一个真实示例:三星Galaxy S3前置摄像头(事实上大多数其他摄像头)的硬件方向为270,所以我在录制时会使用它,并且生成的视频会正确显示.HTC Vivid同样会为同一台相机返回270的硬件方向,但只有degreessetOrientationHintfn中使用90作为参数时才能正确显示.如果我像任何其他手机一样使用270硬件方向,则视频将颠倒过来.

注意:setOrientationHint()功能包括警告:

请注意,某些视频播放器可能会选择在播放期间忽略视频中的合成矩阵.

然而,这不是正在发生的事情,因为如果我伪造它并放入90而不是270,我可以轻松地在这些手机上解决这个问题.

我见过的手机专门展示了这个问题:运行Android 4.0.3的HTC Vivid(PH39100),运行Android 4.0.3的HTC EVO 4G(PG86100),运行Android 2.3.4的HTC Thunderbolt(ADR6400L).请注意,它们都是HTC手机.也许HTC的某个人顺时针错误地逆时针方向错误.

android android-camera android-mediarecorder htc-android

9
推荐指数
1
解决办法
2072
查看次数

执行eglSwapBuffer和eglMakeCurrent时性能低下

我正在开发一个Android Unity插件,允许用户记录他/她的游戏玩法
我的解决方案概述:

  • 使用OpenGl FrameBufferObject(FBO)使Unity渲染到此FBO的屏幕外
  • 获取此FBO的屏幕外纹理,然后用于以下目的:
    • 渲染到视频表面
    • 重绘到设备屏幕
  • 每帧执行流程:
    • 绑定我的FBO
    • 渲染场景到FBO(Unity代码)
    • 解开我的FBO
    • 设置视频表面
      • 配置表面尺寸(仅限第一次执行)
      • 保存egl状态
      • 使视频表面最新
    • 使用我的FBO的屏幕外纹理绘制到视频表面
    • 恢复到默认曲面
      • 将演示时间设置为视频帧
      • 从视频表面到默认窗口交换缓冲区
      • 恢复egl状态
      • 使默认表面电流
    • 通知编码器线程数据已准备好写入

我的问题是表现虽然录音不好.三星Galaxy S4的FPS从60降至40.我试图记录渲染操作的执行时间,并认识到影响最大的性能操作是使视频表面当前操作和交换缓冲区从视频表面到默认窗口操作.以下是他们的代码

public void makeCurrent()
{
 if (!EGL14.eglMakeCurrent(this.mEGLDisplay, this.mEGLSurface, this.mEGLSurface, this.mEGLContext))
  throw new RuntimeException("eglMakeCurrent failed");
}

public boolean swapBuffers()
{
 return EGL14.eglSwapBuffers(this.mEGLDisplay, this.mEGLSurface);
}
Run Code Online (Sandbox Code Playgroud)

执行当前操作的执行时间为1~18 ms
交换缓冲区操作的执行时间为4~14 ms
其他操作的执行时间通常为0~1 ms
如何提高这些操作的性能?
任何帮助将不胜感激!

android opengl-es unity-game-engine opengl-es-2.0 android-mediarecorder

9
推荐指数
1
解决办法
3241
查看次数

在TextureView中旋转Video/MediaPlayer

我正在使用camera2,我在缩略图中长按后显示我的照片/视频的预览.另外,我正在根据拍摄照片时相机的方向旋转它.例如,如果我在90º拍摄照片,我的预览也会旋转90º.

一切正常,我正在使用customContainer,我正在使用onLayout和OnMeasure来创建我的预览,具体取决于屏幕的大小,宽高比和方向.它适用于照片.当我尝试对视频执行相同操作时,我的问题就出现了,它们只能在0º工作.

我试图旋转包含我的MediaPlayer的TextureView但在此之后我的onLayout变得疯狂并且不可能找到(l,t,r,b)组合来正确测量它.

这是我的XML:

<?xml version="1.0" encoding="utf-8"?>

<com.android.camera.ui.common.ThumbnailContainer xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/preview_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/rounded_rectangle_thumbnail_preview"
    android:visibility="invisible">



<TextureView
    android:id="@+id/show_video_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="invisible"/>

<ImageView
    android:id="@+id/image_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:adjustViewBounds="true"
    android:visibility="invisible"

/>
</com.android.camera.ui.common.ThumbnailContainer>
Run Code Online (Sandbox Code Playgroud)

这是我的Surface代码:

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        Log.i(TAG, "InicializoSurface. Width: " + width + "  HEIGHT:" + height);
        Log.i(TAG, "InicializoSurface. Width: " + mVideoView.getMeasuredWidth() + "  HEIGHT:" + mVideoView.getMeasuredHeight());
        Log.i(TAG, "View transform. Width: " + mVideoView.getWidth() + "  HEIGHT:" + mVideoView.getHeight());


        mMediaSurface = new Surface(mVideoView.getSurfaceTexture());
        initializeMediaPlayer();

    }

    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

video layout camera android android-mediarecorder

9
推荐指数
1
解决办法
4912
查看次数

Android mediarecording错误启动失败-19 runTimeException

我的媒体记录存在问题.我正在尝试使用前置摄像头进行录制.这给了我一个错误(但预览工作).每当我使用后置摄像头时一切正常,我认为这很奇怪.可能是什么问题,可能是什么解决方案?我的代码和错误如下所示.

编辑.使用vga前置摄像头录制似乎不起作用.这怎么可能?虽然可以使用HTC相机应用程序录制.

提前感谢你.

protected void startRecording() throws Exception 
{
    mrec = new MediaRecorder();
    mCamera.unlock();

    mrec.setCamera(mCamera);


    mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mrec.setAudioSource(MediaRecorder.AudioSource.MIC); 

    mrec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
    //mrec.setPreviewDisplay(surfaceHolder.getSurface());

    File picDirectory = new File(Environment.getExternalStorageDirectory() +"/TrouwApp");
    picDirectory.mkdirs();

    File mediaStorageDir = new File(Environment.getExternalStorageDirectory() +"/TrouwApp", "Videos");

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
        }
    }

    mrec.setOutputFile( mediaStorageDir.getPath() + File.separator  + date + "_" + videonr+ ".3gp"); 

    mrec.prepare();
    mrec.start();//line 136

    Log.d(TAG, "Recording started!!");
}
Run Code Online (Sandbox Code Playgroud)

添加到清单的行:

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.RECORD_AUDIO" …
Run Code Online (Sandbox Code Playgroud)

java android runtimeexception mediarecorder android-mediarecorder

8
推荐指数
1
解决办法
7182
查看次数

java.lang.RuntimeException:启动失败

我正在尝试使用MediaRecorder在我的一个活动中录制音频.部分代码如下所示.

File file = new File(AppConstants.MSGS_DIR, filename);
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(AudioSource.MIC);
recorder.setOutputFormat(OutputFormat.THREE_GPP);
recorder.setAudioEncoder(AudioEncoder.AMR_WB);
recorder.setOutputFile(file.getAbsolutePath());
try {
    recorder.prepare();
    recorder.start();
} catch (IOException e) {
    System.out.println("Exception: " + e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)

我在清单文件中给出了以下权限.

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
Run Code Online (Sandbox Code Playgroud)

但在行记录器.start()我得到运行时异常.Logcat显示以下错误消息.

09-23 15:47:54.462: E/AndroidRuntime(8697): FATAL EXCEPTION: main
09-23 15:47:54.462: E/AndroidRuntime(8697): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mypackage/com.mypackage.RecordingActivity}: java.lang.RuntimeException: start failed.
09-23 15:47:54.462: E/AndroidRuntime(8697):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2250)
09-23 15:47:54.462: E/AndroidRuntime(8697):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2300)
09-23 15:47:54.462: E/AndroidRuntime(8697): …
Run Code Online (Sandbox Code Playgroud)

android forceclose android-mediarecorder android-permissions

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

无法同时录制视频并从onPreviewFrame回调中获取帧

我正在使用Android应用程序录制视频,我MediaRecorder也希望通过onPreviewFrame回调获取帧数据.

问题是:如果在surfaceChanged回调中重新开始预览,则视频录制将停止工作.如果没有重新启动,通过评论内部的所有内容surfaceChanged,视频录制仍然有效,但onPreviewFrame回调停止工作.

我怎样才能使它们都有效?

CameraActivity.java

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

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CameraActivity extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback {
    private static final String TAG = "CameraActivity";

    public static final int MEDIA_TYPE_IMAGE = 1;
    public static final int MEDIA_TYPE_VIDEO = 2;

    private …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-mediarecorder

8
推荐指数
1
解决办法
1069
查看次数

MediaRecorder 和 VideoSource.SURFACE,停止失败:-1007(一个严重的 Android 错误)

我正在尝试MediaRecorder不使用Camera实例而是使用Surface视频源进行录制(是的,这是可能的,但事实证明它并不完美)-mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);

我只写什么问题:

下一个代码仅适用于某些设备,并在最近的设备重新启动后在某些设备上临时工作或根本不起作用

如果它不起作用 okMediaRecorder.stop()方法失败并出现下一个错误

E/MediaRecorder:停止失败:-1007 W/System.err:

java.lang.RuntimeException:停止失败。在

android.media.MediaRecorder.stop(本机方法)

录音机 mp4 文件太小(千字节),无法播放

测试设备:

适用于联想 P2、小米 A1

不适用于小米红米 5、索尼 Xperia、小米红米 4 Prime

您也可以阅读我的代码中的注释以更好地理解问题

new Thread(() -> {

    MediaRecorder mediaRecorder = new MediaRecorder();

    File file = new File(Environment.getExternalStorageDirectory()
            + File.separator + "test_media_recorder_surface_source.mp4");
    if (file.exists()) {
        file.delete();
    }

    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setOutputFile(file.getAbsolutePath());
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mediaRecorder.setVideoSize(1280, 720);
    mediaRecorder.setCaptureRate(24);

    try {
        mediaRecorder.prepare();

        int sleepTime = 1000 / 24;

        Surface surface = mediaRecorder.getSurface();

        mediaRecorder.start();

        // record something (we can …
Run Code Online (Sandbox Code Playgroud)

android surface android-canvas mediarecorder android-mediarecorder

8
推荐指数
1
解决办法
3648
查看次数