Articles of android mediarecorder

MediaRecorder.stop()停止失败:-1007

我正在使用MediaRecorder录制video。 我的代码在2.3.3上工作正常但在4.0.3上失败。 问题如下:代码mediaRecorder.stop()抛出RuntimeExeption java.lang.RuntimeException: stop failed. at android.media.MediaRecorder.stop(Native Method) 使用LogCat消息 04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007 UPDATE 我发现,MediaPlayer几乎在启动后立即报告错误(通过MediaPlayer.OnErrorListener)。 错误代码为100(媒体服务器死机),额外-1007。 更新2准备MediaRecorder的代码 c = Camera.open(); … // Step 1: Unlock and set camera to MediaRecorder camera.unlock(); mediaRecorder.setCamera(camera); // Step 2: Set sources mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) CamcorderProfile […]

使用Google Vision API的媒体记录器

我正在使用Android vision API中的FaceTracker示例。 但是,我在录制video时遇到了困难,同时在它们上面绘制了叠加层。 一种方法是将位图存储为图像并使用FFmpeg或Xuggler将它们合并为video,但我想知道如果我们可以在预计投影时在运行时录制video,是否有更好的解决方案。 更新1:我使用媒体记录器更新了以下类,但录制仍然无法正常工作。 当我调用triggerRecording()函数时抛出以下错误: MediaRecorder:以无效状态调用:4 我在清单文件中有外部存储权限。 更新2: 我在代码中修复了上述问题,并在onSurfaceCreated回调中移动了setupMediaRecorder()。 但是,当我停止录制时,它会抛出运行时exception。 根据文档,如果没有video/音频数据,将抛出运行时exception。 那么,我在这里错过了什么? public class CameraSourcePreview extends ViewGroup { private static final String TAG = “CameraSourcePreview”; private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); static { ORIENTATIONS.append(Surface.ROTATION_0, 90); ORIENTATIONS.append(Surface.ROTATION_90, 0); ORIENTATIONS.append(Surface.ROTATION_180, 270); ORIENTATIONS.append(Surface.ROTATION_270, 180); } private MediaRecorder mMediaRecorder; /** * Whether the app is […]

通话录音 – 使其适用于Nexus 5X(可以使用root或自定义ROM)

我正在尝试在Nexus 5X,Android 7.1(我自己的AOSP版本)上使用AudioRecord和AudioSource.VOICE_DOWNLINK 。 我已经超过了权限阶段 – 将我的APK移动到特权应用程序,对Android源中的AudioRecord进行了调整,以停止抛出有关此源的exception。 现在我在通话期间得到空录音缓冲区。 我知道有很多通话录音应用程序,它们可以在其他设备上运行。 我也看到某些应用程序可以对已植根的N5执行某些操作并使其正常工作。 我希望在Nexus 5X上实现相同的目标 – 任何调整对我来说都可以,包括更改Android版本,修改Qualcomm驱动程序,设备配置文件等等 – 基本上可以在自定义ROM中实现。 我已经尝试过使用平台代码 – 硬件/ qcom / audio / hal / voice.c,特别是函数voice_check_and_set_incall_rec_usecase ,但到目前为止还没有意义。 还检查了device / lge / bullhead / mixer_paths.xml,发现有一个与呼叫记录相关的部分: 但我也无法理解它或它是如何得到帮助的。

MediaRecorder在启动时崩溃

我search了很多主题,但没有直接的答案。 我有这个代码: 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; } 我已经添加了: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> (看到joinSTORAGE的地方解决了它,对我来说没有好处) 我正在开发API级别7(Android […]

使用表面视图android录制video

我必须创build一个Android应用程序,我正在尝试使用曲面视图来loggingvideo和捕捉图像。 到目前为止,我能够捕捉video,但在录制video时遇到问题。 我的video录制代码是 – onCreate(){ .. surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); startRecording(); . . } protected void startRecording() throws IOException { if(mCamera==null) mCamera = Camera.open(); String filename; String path; path= Environment.getExternalStorageDirectory().getAbsolutePath().toString(); Date date=new Date(); filename="/rec"+date.toString().replace(" ", "_").replace(":", "_")+".mp4"; File file=new File(path,filename); mrec = new MediaRecorder(); mCamera.lock(); mCamera.unlock(); mrec.setCamera(mCamera); mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA); mrec.setAudioSource(MediaRecorder.AudioSource.MIC); mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mrec.setPreviewDisplay(surfaceHolder.getSurface()); mrec.setOutputFile(path+filename); […]

我怎样才能在Android中暂停录音?

我的目标是暂停录制文件。 我在Android开发人员网站上看到它的Media Recorder没有暂停选项。 Java支持以编程方式合并两个audio文件,但在android中不起作用。 join两个来自Java的WAV文件? 而且我也使用默认的设备录音机应用程序在所有设备上都可用,但在三星几乎没有设备录音path。 Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); startActivityForResult(intent,REQUESTCODE_RECORDING); 任何一个帮助录音暂停function。

无法在iOS 5+中播放来自Android的录制audio文件

我正在开发也支持iOS的Android应用程序。 我想录制audio,并在Android设备以及iOS设备中播放。 我使用以下设置在Android中录制audio MediaRecorder audioRecorder = new MediaRecorder(); audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); audioRecorder.setAudioSamplingRate(44100); audioRecorder.setAudioChannels(1); audioRecorder.setAudioEncodingBitRate(12800); audioRecorder.setOutputFile(<recordedSoundFilePath>); audioRecorder.prepare(); audioRecorder.start(); 在iOS端,设置如下 //audioRecorder is object of AVAudioRecorder NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] initWithCapacity:10]; NSNumber *formatObject; formatObject = [NSNumber numberWithInt: kAudioFormatMPEG4AAC ]; [recordSettings setObject:formatObject forKey: AVFormatIDKey]; [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey]; [recordSettings setObject:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey]; [recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey]; [recordSettings […]

当执行eglSwapBuffer和eglMakeCurrent时性能低下

我正在开发一个允许用户logging他/她的游戏玩法的Android Unity插件 我的解决scheme概述: 使用OpenGl FrameBufferObject(FBO)使Unity渲染离开这个FBO 获得这个FBO的离线纹理,然后用于2个目的: 渲染到video表面 重绘到设备屏幕 每帧执行stream程: 绑定我的FBO 渲染场景到FBO(统一码) 解开我的FBO 设置video表面 configuration表面大小(仅限第一次执行) 保存egl状态 使video表面电stream 使用FBO的离屏纹理绘制到video表面 恢复到默认的表面 将演示时间设置为video帧 从video表面交换缓冲区到默认窗口 恢复egl状态 使默认的表面电stream 通知编码器线程数据已准备好写入 我的问题是录制时的performance不好。 三星Galaxy S4的FPS从60降低到40。 我试图logging渲染操作的执行时间,并认识到最影响性能操作是使video表面当前操作和从video表面到默认窗口操作的交换缓冲区。 以下是他们的代码 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); } 执行当前操作的时间为1〜18 ms 交换缓冲区的执行时间为4〜14 ms 其他操作的执行时间通常为0〜1 […]

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

问题:某些Android设备(问题底部列出)在使用前置摄像头拍摄的video的setOrientationHint(int degrees)function时会出现意外的行为。 预期的行为是video顺时针旋转,但这些设备逆时针旋转video。 我的目标:在相机设置或硬件方向内识别variables,使我可以预知何时会发生这种情况。 具体来说, 我想避免在我的代码中特别套住这些手机! 更多解释:我使用标准的MediaRecorder对象录制video,在准备录制时,使用setOrientationHint()设置video的方向。 在setOrientationHint()的文档中,为degrees参数指定了以下内容: 度 – 以度数顺时针旋转的angular度。 支持的angular度是0,90,180和270。 该function旨在添加包含旋转angular度的合成matrix,以便video播放器可按预期显示video。 所以,我所做的是使用CameraInfo类获取相机硬件的方向, CameraInfo其用作setOrientationHint fn中的degrees参数。 (我已经尝试使用AOSP作为指导,对此代码进行修改,但是我得到了完全相同的结果。) 一个真实的例子:三星Galaxy S3前置摄像头(以及其他大多数其他摄像头)的硬件方向将为270,因此在录制时使用此方式,并且所得video显示正确。 HTC Vivid同样会为相同的相机返回270的硬件方向,但只有在setOrientationHint fn中使用90 degrees作为degrees参数时才能正确显示。 如果我像其他手机一样使用270的硬件定位,则video将会颠倒。 注意: setOrientationHint()函数包含一个警告: 请注意,某些video播放器可能会在播放期间忽略video中的构图matrix。 但是,这不是发生的事情,因为我可以很容易地解决这个问题,如果我假装它,把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错误顺时针逆时针。

如何将通过MediaRecorder录制的video长度读取到通过context.getFilesDir()构build的私有应用程序存储目录中?

我有一个奇怪的问题,通过使用MediaRecorder读取设备相机logging的video文件的长度/持续时间。 该文件被logging到应用程序的专用存储目录中,其设置如下所示: mMediaRecorder.setOutputFile(context.getFilesDir() + "/recordings/webcam.3gpp"); 录制完成后,我尝试用这些方法读取video的长度: 方法1: MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(context.getFilesDir() + "/recordings/webcam.3gpp"); String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); return Long.parseLong(time); 方法2: MediaPlayer mp = MediaPlayer.create(context, Uri.parse(context.getFilesDir() + "/recordings/webcam.3gpp")); long duration = mp.getDuration(); mp.release(); return duration; 没有任何方法的工作。 mediaMetadataRetriever.extractMetadata返回null, MediaPlayer.create将以IOExceptionexception失败。 我已经validation该文件存在。 重要说明:如果将录制内容保存到“/sdcard/recordings/webcam.3gpp”,则不会发生此问题。 出于某种原因,我只是不能读取文件在属于应用程序的私人文件目录中的持续时间。 此外,这个问题只发生在我的三星Droid充电,运行Android 2.3。 它不会发生在运行Android 4.2的三星Galaxy S4和运行Android 4.3的Asus Nexus 7。 编辑: 如果我把相同的文件复制到SD卡上,然后阅读它的长度,一切正常。 是什么赋予了? copy(new File(context.getFilesDir() […]