标签: android-mediarecorder

为什么在textureview中的相机预览比在surfaceview中更模糊?

我发现当使用textureview而不是surfaceview作为相机预览(两者都通过mediarecorder连接到相机)时,预览会更加模糊.

模糊的意思是在纹理视图中你可以看到像素,特别是在缩放时.使用surfaceview时不是这种情况.为什么会这样?

android surfaceview android-camera android-mediarecorder textureview

11
推荐指数
1
解决办法
1313
查看次数

使用MediaRecorder录制mp4时获取/修改帧

我用以下代码录制mp4.但是在我录音的时候

1-是否可以以阵列数据或其他格式实时获取视频帧?

2-是否可以修改帧?例如,反转颜色并使其看起来是负面的.

public class MainActivity extends Activity implements OnClickListener, SurfaceHolder.Callback {
MediaRecorder recorder;
SurfaceHolder holder;
boolean recording = false;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    recorder = new MediaRecorder();
    initRecorder();
    setContentView(R.layout.activity_main);

    SurfaceView cameraView = (SurfaceView) findViewById(R.id.surfaceView1);
    holder = cameraView.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    cameraView.setClickable(true);
    cameraView.setOnClickListener(this);
}

private void initRecorder() {
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

    CamcorderProfile cpHigh = CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH);
    recorder.setProfile(cpHigh);

    recorder.setOutputFile(Environment.getExternalStorageDirectory().getPath() + "/video.mp4");
    recorder.setMaxDuration(50 * 1000); // 50 seconds
    recorder.setMaxFileSize(5 * 1000000); // Approximately 5 megabytes
}

private …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-mediarecorder

11
推荐指数
1
解决办法
6630
查看次数

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
查看次数

CamcorderProfile.videoCodec返回错误的值

根据docs,您可以CamcorderProfile用来获取设备的默认视频编解码器格式,然后将其设置为MediaRecorder,如下所示:

CamcorderProfile mProfile = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_HIGH);

//

mMediaRecorder.setVideoEncoder(mProfile.videoCodec);
Run Code Online (Sandbox Code Playgroud)

但是由于某种原因,它返回了错误的格式。

我正在使用CameraView库,并在FullVideoRecorder类中定义了以下内容:

switch (mResult.getVideoCodec()) {
    case H_263: mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); break;
    case H_264: mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); break;
    case DEVICE_DEFAULT: mMediaRecorder.setVideoEncoder(mProfile.videoCodec); break;
} 
Run Code Online (Sandbox Code Playgroud)

当我将视频编码器设置为时,遇到问题的设备可以很好地工作H_263,但是由于某种原因,当我将其设置为默认时,它会崩溃-在这种情况下,默认意味着CamcorderProfile应选择设备默认的视频编解码器格式。


我的问题:

有什么原因CamcorderProfile.videoCodec会返回错误的值,如何解决?


编辑 -添加更多信息

我实现了以下内容,以确保是否CamcoderProfile返回了错误的值:

//In onCreate
CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);

//getVideoCodec method below
String profileCodec = getVideoCodec(camcorderProfile.videoCodec);    

//Log the result I get
Log.e("Video Codec =", profileCodec);


private String getVideoCodec(int videoCodec){
    switch(videoCodec){
        case MediaRecorder.VideoEncoder.H263:
            return …
Run Code Online (Sandbox Code Playgroud)

java android android-camera android-mediarecorder

11
推荐指数
1
解决办法
278
查看次数

Android相机预览回调和mediarecorder录制视频

我想创建一个应用程序,它必须记录视频(使用媒体记录器)和录制的视频需要格式化(使用相机).
我创建了下面显示的示例代码,但是当从菜单按下startrecording按钮时显示错误.它显示强制关闭错误.但previewcallback没有错误.我的代码如下所示

  package buffer.video;
    import android.app.Activity;
    import android.os.Bundle;
    import java.io.IOException;  
    import android.app.Activity;
    import android.hardware.Camera;
    import android.hardware.Camera.PreviewCallback;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.widget.Toast;

    public class VofoVideoToBufferActivity extends Activity implements SurfaceHolder.Callback,
    Camera.AutoFocusCallback {

    private SurfaceView preview;
    private SurfaceHolder previewHolder;

    private MediaRecorder mRecorder;
    private Camera mCamera;
    private boolean mPreviewRunning = false;
    private boolean mCaptureFrame = false;


    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e("", "Begin onCreate");
    setContentView(R.layout.main);

    preview = (SurfaceView) findViewById(R.id.surfaceView1);
    previewHolder …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-mediarecorder

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

Android:从Fragment调用Activity

我在活动中使用片段.我正在使用MediaRecorder进行录音.我有两项活动.1st本身是将列出录制文件的Activity.在它的右侧,当一个选择记录新文件时,将调用AudioRecording Activity.当选择任何列出的文件时,我使用AudioPlayer播放录制的文件.我在这里能够将Activity转换为片段但是当我按下Stop时它终止了应用程序.

请有人可以回答.当我将它用作简单的活动时,我的audiorecorder工作正常.任何解决方案,如果我可以在该片段中调用该活动或类似的东西.?如果有人知道,请帮助我.

android android-intent android-fragments android-mediarecorder android-audiomanager

10
推荐指数
3
解决办法
8万
查看次数

10秒后MediaRecorder.finalize()中的TimeoutException

stacktrace0=java.util.concurrent.TimeoutException:
android.media.MediaRecorder.finalize() timed out after 10
seconds
    at android.media.MediaRecorder.native_finalize(Native Method)
    at android.media.MediaRecorder.finalize(MediaRecorder.java:1200)
    at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
    at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
    at java.lang.Thread.run(Thread.java:841)

if (isDirectoryExists) 
{
MediaRecorder recorder= new MediaRecorder();
recorder.reset();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path);
recorder.setMaxDuration(30*60*1000);

if(recorder!=null)
{
    recorder.prepare();
}
try
{
    if(recorder!=null)
    {
        recorder.start();
        isRecordingStarted=true;
    }
}
catch (IllegalStateException ilse) 
{
    try
    {
        if(recorder!=null)
        {
            recorder.prepare();
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    try
    {
        if(recorder!=null)
        {
            recorder.start();
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

详细说明:这个问题主要是在我们再次准备和启动媒体记录器时第一次发生异常时到达android 4.3.这个逻辑在4.0中成功运行..我不明白为什么会发生这种异常.

android android-mediarecorder

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

如何从Android发送视频到服务器,当转到URL分配给它时能够在浏览器中播放?

我使用Retrofit 2将视频文件(从相机捕获)发送到我的PHP服务器,视频成功上传到服务器中的文件夹(我使用FileZilla检查,视频存在于文件夹中),我将视频分配给URL,我去同一个网址(使用浏览器)它无法播放视频.

它只是在Url中显示(例如:mydomain.cc/video/VID_2014.mp4)

在此输入图像描述

所以我用随机视频测试,通过邮递员发送,该视频的URL能够播放.

像这样:

在此输入图像描述

Android中我在onActivityResult捕获视频后进入的视频文件路径如下所示

/storage/emulated/0/DCIM/ABC/VID_20171008_183129.mp4

这是我发送视频文件的代码

 private void uploadVideoToServer(String pathToVideoFile){
    File videoFile = new File(pathToVideoFile);
    RequestBody videoBody = RequestBody.create(MediaType.parse("video/*"), videoFile);
    MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody);
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(SERVER_PATH)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    VideoInterface vInterface = retrofit.create(VideoInterface.class);
    Call<ResultObject>  serverCom = vInterface.uploadVideoToServer(vFile);
    serverCom.enqueue(new Callback<ResultObject>() {
        @Override
        public void onResponse(Call<ResultObject> call, Response<ResultObject> response) {
            ResultObject result = response.body();
            if(!TextUtils.isEmpty(result.getSuccess())){
                Toast.makeText(MainActivity.this, "Result " + result.getSuccess(), Toast.LENGTH_LONG).show();
                Log.d(TAG, "Result " + result.getSuccess());
            }
        }
        @Override
        public void onFailure(Call<ResultObject> call, …
Run Code Online (Sandbox Code Playgroud)

android video-recording mediarecorder android-mediarecorder retrofit2

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

使用 MediaRecorder.AudioSource.VOICE_COMMUNICATION 录制的音频在某些 Android 10 设备上为空

我正在使用以下代码在应用程序中录制语音消息的音频。

MediaRecorder audioRecorder = new MediaRecorder();
audioRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
audioRecorder.setOutputFile(audioRecordingFile);
audioRecorder.prepare();
audioRecorder.start();
Run Code Online (Sandbox Code Playgroud)

使用MediaRecorder.AudioSource.VOICE_COMMUNICATION而不是MediaRecorder.AudioSource.MIC)对于录制预处理干净的音频非常有帮助。

但是,最近我发现在一些最近更新到 Android 10 的设备上报告了一些记录文件为空的问题。 应该注意的是,并非所有的 Android 10 设备都有这些问题,只有少数,即诺基亚 6.1 和米A2。

没有错误或异常,只是空的音频输出文件。

如果我使用MediaRecorder.AudioSource.MIC),则不会出现此问题。

我发现以下与 Android 10 和 VOICE_COMMUNICATION 相关的信息 Android 10 版本包括以下使用 VOICE_COMMUNICATION 捕获的要求。

基于此,我使用以下代码检查了 AcousticEchoCanceler、AutomaticGainControl 和 NoiseSuppressor 的可用性。

AcousticEchoCanceler.isAvailable()
AutomaticGainControl.isAvailable()
NoiseSuppressor.isAvailable()
Run Code Online (Sandbox Code Playgroud)

并在搭载 Android 10 的 Mi A2 和 OnePlus 6 上发现了相同的结果。这两款设备都显示 AcousticEchoCanceler 和 NoiseSuppressor 可用,而 AutomaticGainControl 不可用。

由于并非所有 Android 设备都存在此问题,因此我不想依赖于使用MediaRecorder.AudioSource.MIC)。同时,没有错误、异常或区分因素告诉我何时回退到 MediaRecorder.AudioSource.MIC)

更新: 在 Mi A2 上关闭 Google …

android android-mediarecorder android-10.0

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