我的媒体记录存在问题.我正在尝试使用前置摄像头进行录制.这给了我一个错误(但预览工作).每当我使用后置摄像头时一切正常,我认为这很奇怪.可能是什么问题,可能是什么解决方案?我的代码和错误如下所示.
编辑.使用vga前置摄像头录制似乎不起作用.这怎么可能?虽然可以使用HTC相机应用程序录制.
提前感谢你.
protected void startRecording() throws Exception
{
mrec = new MediaRecorder();
mCamera.unlock();
mrec.setCamera(mCamera);
mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mrec.setAudioSource(MediaRecorder.AudioSource.MIC);
mrec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
//mrec.setPreviewDisplay(surfaceHolder.getSurface());
File picDirectory = new File(Environment.getExternalStorageDirectory() +"/TrouwApp");
picDirectory.mkdirs();
File mediaStorageDir = new File(Environment.getExternalStorageDirectory() +"/TrouwApp", "Videos");
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
}
}
mrec.setOutputFile( mediaStorageDir.getPath() + File.separator + date + "_" + videonr+ ".3gp");
mrec.prepare();
mrec.start();//line 136
Log.d(TAG, "Recording started!!");
}
Run Code Online (Sandbox Code Playgroud)
添加到清单的行:
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.RECORD_AUDIO" …Run Code Online (Sandbox Code Playgroud) java android runtimeexception mediarecorder android-mediarecorder
我有一个奇怪的问题,通过使用MediaRecorder读取使用设备的相机记录的视频文件的长度/持续时间.该文件记录在应用程序的专用存储目录中,其目的如下:
mMediaRecorder.setOutputFile(context.getFilesDir() + "/recordings/webcam.3gpp");
Run Code Online (Sandbox Code Playgroud)
录制完成后,我尝试使用以下方法读取视频的长度:
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(context.getFilesDir() + "/recordings/webcam.3gpp");
String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
return Long.parseLong(time);
Run Code Online (Sandbox Code Playgroud)
MediaPlayer mp = MediaPlayer.create(context, Uri.parse(context.getFilesDir() + "/recordings/webcam.3gpp"));
long duration = mp.getDuration();
mp.release();
return duration;
Run Code Online (Sandbox Code Playgroud)
这些方法都不起作用.mediaMetadataRetriever.extractMetadata返回null并MediaPlayer.create失败并返回IOException.我已经验证该文件存在.
重要说明:如果我将录音保存到"/sdcard/recordings/webcam.3gpp",则不会发生此问题.出于某种原因,我只是无法读取文件位于属于应用程序的专用文件目录中的持续时间.此外,这个问题只发生在运行Android 2.3的Samsung Droid Charge上.它不会发生在运行Android 4.2的三星Galaxy S4和运行Android 4.3的华硕Nexus 7上.
如果我拿相同的文件并将其复制到SD卡,然后在那里读取它的长度,一切正常.是什么赋予了?
copy(new File(context.getFilesDir() + "/recordings/webcam.3gpp"), new File("/sdcard/wtfisthiscrap.3gpp"));
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource("/sdcard/wtfisthiscrap.3gpp");
String time = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
return Long.parseLong(time); // works!
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?
android android-video-player android-camera android-mediaplayer android-mediarecorder
我正在尝试使用MediaRecorder在我的一个活动中录制音频.部分代码如下所示.
File file = new File(AppConstants.MSGS_DIR, filename);
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(AudioSource.MIC);
recorder.setOutputFormat(OutputFormat.THREE_GPP);
recorder.setAudioEncoder(AudioEncoder.AMR_WB);
recorder.setOutputFile(file.getAbsolutePath());
try {
recorder.prepare();
recorder.start();
} catch (IOException e) {
System.out.println("Exception: " + e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
我在清单文件中给出了以下权限.
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
Run Code Online (Sandbox Code Playgroud)
但在行记录器.start()我得到运行时异常.Logcat显示以下错误消息.
09-23 15:47:54.462: E/AndroidRuntime(8697): FATAL EXCEPTION: main
09-23 15:47:54.462: E/AndroidRuntime(8697): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mypackage/com.mypackage.RecordingActivity}: java.lang.RuntimeException: start failed.
09-23 15:47:54.462: E/AndroidRuntime(8697): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2250)
09-23 15:47:54.462: E/AndroidRuntime(8697): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2300)
09-23 15:47:54.462: E/AndroidRuntime(8697): …Run Code Online (Sandbox Code Playgroud) android forceclose android-mediarecorder android-permissions
我正在使用Android应用程序录制视频,我MediaRecorder也希望通过onPreviewFrame回调获取帧数据.
问题是:如果在surfaceChanged回调中重新开始预览,则视频录制将停止工作.如果没有重新启动,通过评论内部的所有内容surfaceChanged,视频录制仍然有效,但onPreviewFrame回调停止工作.
我怎样才能使它们都有效?
CameraActivity.java
import android.app.Activity;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CameraActivity extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback {
private static final String TAG = "CameraActivity";
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
private …Run Code Online (Sandbox Code Playgroud) 我正在尝试MediaRecorder不使用Camera实例而是使用Surface视频源进行录制(是的,这是可能的,但事实证明它并不完美)-mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
我只写什么问题:
下一个代码仅适用于某些设备,并在最近的设备重新启动后在某些设备上临时工作或根本不起作用
如果它不起作用 okMediaRecorder.stop()方法失败并出现下一个错误
E/MediaRecorder:停止失败:-1007 W/System.err:
java.lang.RuntimeException:停止失败。在
android.media.MediaRecorder.stop(本机方法)
录音机 mp4 文件太小(千字节),无法播放
测试设备:
适用于联想 P2、小米 A1
不适用于小米红米 5、索尼 Xperia、小米红米 4 Prime
您也可以阅读我的代码中的注释以更好地理解问题
new Thread(() -> {
MediaRecorder mediaRecorder = new MediaRecorder();
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "test_media_recorder_surface_source.mp4");
if (file.exists()) {
file.delete();
}
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoSize(1280, 720);
mediaRecorder.setCaptureRate(24);
try {
mediaRecorder.prepare();
int sleepTime = 1000 / 24;
Surface surface = mediaRecorder.getSurface();
mediaRecorder.start();
// record something (we can …Run Code Online (Sandbox Code Playgroud) android surface android-canvas mediarecorder android-mediarecorder
我MediaRecorder在Android上需要一些帮助.
我尝试使用getSupportedVideoSizes获取支持的视频大小列表,但它始终返回null.
在测试中,以下设备null在getSupportedVideoSizes查询时返回:
您好我正在尝试使用mediarecorder api并生成包含h264视频和aac音频的mpeg2ts输出.
1)当我单独录制视频时,生成的输出.ts文件工作正常,没有任何延迟.2)当我录制音频和视频时,应用程序崩溃.所以我在网上进行了一些搜索,发现它是AOSP框架中的MPEG2TS writer.cpp中的一个错误,基于这个链接,<< code.google.com/p/android/issues/detail?id=37714> >我应用了建议的补丁并尝试了同样的方法.我能够对音频和视频进行编码,但生成的输出文件存在问题.
3)作者没有正确的工作.有滞后.首先播放视频帧,然后在视频冻结时播放音频,然后播放.
4)编写器代码可以在这里找到 - > << androidxref.com/4.2.2_r1/xref/frameworks/av/media/libstagefright/MPEG2TSWriter.cpp >>
我添加的补丁可以在这里找到 - > << code.google.com/p/android/issues/attachmentText?id=37714&aid=377140007000&name=patch&token=E7rjXqE55TIp50S7sI04mxbsRCA%3A1384836153502 >>
5)有人请告诉我作者的问题是什么,如何在代码中修复它,请提供一些固定的代码片段.
我的android源代码是:
myCamera = getCameraInstance();
mediaRecorder = new MediaRecorder();
myCamera.unlock();
mediaRecorder.setCamera(myCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(8);
mediaRecorder.setOutputFile("/sdcard/myvideo.ts");
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoSize(320, 240);
mediaRecorder.setVideoFrameRate(15);
mediaRecorder.setMaxDuration(20);
mediaRecorder.setMaxFileSize(10000);
mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder()
.getSurface());
Run Code Online (Sandbox Code Playgroud)
6)一旦我让ts编写器工作,我需要通过RTP发送ts数据包进行直播,所以请帮助修复ts writer问题.
我想录制没有声音的原始h.264视频,并且可能加速HW(并稍后流式传输).所以我决定使用MediaRecorder(和套接字hack进行流式传输).
我有以下代码:
final MediaRecorder recorder = new MediaRecorder();
final Camera camera = Camera.open();
camera.unlock();
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
final CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
recorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
recorder.setVideoFrameRate(profile.videoFrameRate);
recorder.setVideoEncodingBitRate(profile.videoBitRate);
recorder.prepare();
recorder.start();
Run Code Online (Sandbox Code Playgroud)
和bam!这在logcat中:
E/MediaRecorder? start failed: -38
Run Code Online (Sandbox Code Playgroud)
我开始谷歌搜索,发现了很多问题和答案,但没有关于我的错误代码-38.
所以我试着看看Android 源代码,并注意到它的native方法,我不知道在哪里寻找它.
所以我的一个大问题是:是否有一些错误代码列表,所以我可以找到错误的-38含义?`
也知道tjat我的目标是API 10(Gingerbread)并使用最新的SDK 21构建.
我编写了下面显示的Android服务,用于在后台录制前置摄像头.这非常有效.但现在我想在录制的同时每隔5秒拍一张照片.这有点可能吗?当我尝试打开第二台相机(在另一项服务中)时,我收到了错误消息.
public class RecorderService extends Service implements SurfaceHolder.Callback {
private WindowManager windowManager;
private SurfaceView surfaceView;
private Camera camera = null;
private MediaRecorder mediaRecorder = null;
@Override
public void onCreate() {
// Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback
windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
surfaceView = new SurfaceView(this);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
1, 1,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT
);
layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
windowManager.addView(surfaceView, layoutParams);
surfaceView.getHolder().addCallback(this); …Run Code Online (Sandbox Code Playgroud)