Articles of android mediarecorder

无需使用媒体提取器,无法在Android 4.2上对video进行低级解码

我想在不使用提取器的情况下解码video帧。 所以我只尝试了一个小样本,我使用了媒体提取器,但是我没有使用extractor.readsample()将比特流数据复制到输入缓冲区而是使用FFmpeg解析器,在JNI中,我将video帧记忆到输入字节缓冲区然后将输入缓冲区排队..但是当我调用decoder.dequeueOutputBuffer(info, 10000) ,它返回MediaCodec.INFO_TRY_AGAIN_LATER 。 如果我使用extractor.readsample()它可以正常工作。 请在下面find代码段: Java方面: import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import android.app.Activity; import android.media.MediaCodec; import android.media.MediaCodec.BufferInfo; import android.media.MediaExtractor; import android.media.MediaFormat; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; public class VideoBrowser extends Activity implements SurfaceHolder.Callback { private static final String SAMPLE = Environment.getExternalStorageDirectory() […]

Android通话录音未录制来电语音

我正在使用自动呼叫记录器应用程序,我能够使用MediaRecorder.AudioSource.VOICE_CALL在android 6下方录制语音呼叫,从android 6无法使用VOICE_CALL录制语音呼叫。 我设法使用MediaRecorder.AudioSource.MIC进行录制,但这里传入的语音没有录制,我想在正常模式下录制语音通话,而不是在扬声器模式下录制。 请帮帮我。 (我曾尝试过Xiomi Redmi 4a(android 6),没有工作)。 myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); myRecorder.setMaxDuration(60 * 60 * 1000); AudioManager audiomanager = (AudioManager)getSystemService(AUDIO_SERVICE); audiomanager.setMode(2); 编辑:权限没有问题。 更新:任何人都知道如何强制另一个流到MIC音频源。 这需要原生的android代码。 请帮助我。 有关路由音频的更多详细信息,请参阅此问题

任何人都有MediaRecorder使用ParcelFileDescriptor和createPipe()?

我试图找出一个录制音频的例子,数据存储由应用处理,而不是MediaRecorder 。 用例包括将记录存储在内部存储器或加密记录。 原则上,这应该使用由createPipe()上的createPipe()创建的管道,但我得到格式错误的输出。 首先, 这是一个使用MediaRecorder “自然”记录的示例项目 , MediaRecorder直接写入外部存储器上的输出文件。 这个应用程序运行正常,输出可以由记录它的Android设备或我的Linux机器上的VLC播放。 这是我的createPipe()项目的变体 。 从一般的MediaRecorder配置(例如, setOutputFormat() )的角度来看,它与第一个相同,因此代码可能是正确的。 但是,我通过以下方式提供输出: recorder.setOutputFile(getStreamFd()); getStreamFd()使用createPipe() ,生成后台线程以从管道读取,并返回写入结束以供MediaRecorder使用: private FileDescriptor getStreamFd() { ParcelFileDescriptor[] pipe=null; try { pipe=ParcelFileDescriptor.createPipe(); new TransferThread(new AutoCloseInputStream(pipe[0]), new FileOutputStream(getOutputFile())).start(); } catch (IOException e) { Log.e(getClass().getSimpleName(), “Exception opening pipe”, e); } return(pipe[1].getFileDescriptor()); } TransferThread是一个经典的java.io流到流复制例程,增加了智能来刷​​新和同步输出文件: static class TransferThread extends Thread { InputStream in; […]

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 […]