我发现当使用textureview而不是surfaceview作为相机预览(两者都通过mediarecorder连接到相机)时,预览会更加模糊.
模糊的意思是在纹理视图中你可以看到像素,特别是在缩放时.使用surfaceview时不是这种情况.为什么会这样?
android surfaceview android-camera android-mediarecorder textureview
我用以下代码录制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 …我正在使用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);
问题是捕获的图像包含如下图像的黑框.
编辑
上述问题可以通过位图操作来解决.
不过,我现在正在寻找可以应用到解决方案MediaProjection或SurfaceView中ImageReader实现设备记录.
我在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);
      }
   } …android mediarecorder android-mediarecorder android-support-library
根据docs,您可以CamcorderProfile用来获取设备的默认视频编解码器格式,然后将其设置为MediaRecorder,如下所示:
CamcorderProfile mProfile = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_HIGH);
//
mMediaRecorder.setVideoEncoder(mProfile.videoCodec);
但是由于某种原因,它返回了错误的格式。
我正在使用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;
} 
当我将视频编码器设置为时,遇到问题的设备可以很好地工作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 …我想创建一个应用程序,它必须记录视频(使用媒体记录器)和录制的视频需要格式化(使用相机).
我创建了下面显示的示例代码,但是当从菜单按下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 …我在活动中使用片段.我正在使用MediaRecorder进行录音.我有两项活动.1st本身是将列出录制文件的Activity.在它的右侧,当一个选择记录新文件时,将调用AudioRecording Activity.当选择任何列出的文件时,我使用AudioPlayer播放录制的文件.我在这里能够将Activity转换为片段但是当我按下Stop时它终止了应用程序.
请有人可以回答.当我将它用作简单的活动时,我的audiorecorder工作正常.任何解决方案,如果我可以在该片段中调用该活动或类似的东西.?如果有人知道,请帮助我.
android android-intent android-fragments android-mediarecorder android-audiomanager
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();
    }
}
}
详细说明:这个问题主要是在我们再次准备和启动媒体记录器时第一次发生异常时到达android 4.3.这个逻辑在4.0中成功运行..我不明白为什么会发生这种异常.
我使用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, …android video-recording mediarecorder android-mediarecorder retrofit2
我正在使用以下代码在应用程序中录制语音消息的音频。
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();
使用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()
并在搭载 Android 10 的 Mi A2 和 OnePlus 6 上发现了相同的结果。这两款设备都显示 AcousticEchoCanceler 和 NoiseSuppressor 可用,而 AutomaticGainControl 不可用。
由于并非所有 Android 设备都存在此问题,因此我不想依赖于使用MediaRecorder.AudioSource.MIC)。同时,没有错误、异常或区分因素告诉我何时回退到 MediaRecorder.AudioSource.MIC)。
更新: 在 Mi A2 上关闭 Google …