android MediaRecorder start failed:-38

最近在学习android 录音方面的知识,发现在部分手机正常运行的APP,在华为平板上挂了,eclipse的Logcat显示MediaRecorder start failed:-38。查了下资料,原因是我的APP在编码时使用了多路录音,而调试用的华为平板在硬件上只能单路录音,不支持多路录音。目前mtk的75,15,77,17平台硬件上只支持单路录音,不支持多路录音,后续89平台在这块已经做了改进,多路录音需要硬件支持,后续更高阶的平台是可以支持多路录音的。PDXXXX是mtk77平台,硬件上只支持单路录音,不支持多路录音。

解决的办法就是优化代码,看能不能从代码上调整为单路录音了。
以下是我APP中两处用到MIC SOURCE之处,分别用来实现边录音边播放以及保存录音文件。在支持多路录音的手机上正常运行,而在不支持多路录音的平台上,通过改代码,测试发现要么只能边录音边播放,要么只能保存录音文件。要想保存录音文件,必须得在start前(需要一段时间延迟)释放边录音边播放占用的MIC SOURCE。

AudioRecord audioRecord2 = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,    
                channelConfiguration, audioEncoding, recBufSize);    

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency,    
                cha
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 上录制 MP4 并添加时间水印,你可以使用 MediaRecorder 和 Canvas 对象。下面是一个简单的示例代码: ```java public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private MediaRecorder mediaRecorder; private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private boolean isRecording = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化 SurfaceView 和 SurfaceHolder surfaceView = findViewById(R.id.surface_view); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { // 初始化 MediaRecorder mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setVideoEncodingBitRate(10000000); mediaRecorder.setVideoFrameRate(30); mediaRecorder.setVideoSize(1280, 720); mediaRecorder.setOutputFile(getOutputFile().getAbsolutePath()); mediaRecorder.setOrientationHint(90); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); try { mediaRecorder.prepare(); } catch (IOException e) { Log.e(TAG, "prepare() failed: " + e.getMessage()); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { releaseMediaRecorder(); } }); } private File getOutputFile() { File dir = new File(Environment.getExternalStorageDirectory(), "MyVideo"); if (!dir.exists()) { dir.mkdirs(); } SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()); String currentTimeStamp = dateFormat.format(new Date()); return new File(dir.getAbsolutePath() + File.separator + "VID_" + currentTimeStamp + ".mp4"); } private void releaseMediaRecorder() { if (mediaRecorder != null) { try { mediaRecorder.stop(); mediaRecorder.reset(); mediaRecorder.release(); mediaRecorder = null; } catch (Exception e) { Log.e(TAG, "releaseMediaRecorder() failed: " + e.getMessage()); } } } private void startRecording() { mediaRecorder.start(); isRecording = true; // 开始绘制时间水印 new Thread(new Runnable() { @Override public void run() { Canvas canvas = surfaceHolder.lockCanvas(); Paint paint = new Paint(); paint.setColor(Color.RED); paint.setTextSize(60); while (isRecording) { canvas.drawText(getCurrentTime(), 100, 100, paint); surfaceHolder.unlockCanvasAndPost(canvas); SystemClock.sleep(1000); } } }).start(); } private void stopRecording() { isRecording = false; releaseMediaRecorder(); } private String getCurrentTime() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); return dateFormat.format(new Date()); } public void onRecordBtnClick(View view) { if (isRecording) { stopRecording(); ((Button) view).setText("Record"); } else { startRecording(); ((Button) view).setText("Stop"); } } } ``` 上面的代码中,我们首先使用 MediaRecorder 和 SurfaceHolder 来初始化录制器和 SurfaceView。然后,我们在 surfaceCreated() 方法中初始化了 MediaRecorder 并将其准备好。在录制开始时,我们使用 Canvas 对象绘制时间水印,并将其加入到 SurfaceView 中。在录制结束时,我们释放了 MediaRecorder 并停止了绘制水印的线程。 需要注意的是,为了在 Android 上录制视频,你需要在 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 同时,你也需要在运行时请求这些权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值