我有一个在Android 2.2上运行的三星Galaxy选项卡.我开发了一个简单的程序来分别录制音频和视频.它在我的galaxy选项卡上正常工作.但是,在将其升级到android 2.3.3后,一切都发生了变化.我的代码从那一刻开始停止工作.这是我的代码显示这个意外(对我:) :)行为:
// import statements
public class CameraPreview extends Activity implements SurfaceHolder.Callback {
Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;
Button recordButton;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().setFormat(PixelFormat.UNKNOWN);
surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
controlInflater = LayoutInflater.from(getBaseContext());
View viewControl = controlInflater.inflate(R.layout.control, null);
LayoutParams layoutParamsControl = new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
this.addContentView(viewControl, layoutParamsControl);
recordButton = (Button)viewControl.findViewById(R.id.start_recording);
recordButton.setOnClickListener(new View.OnClickListener() …Run Code Online (Sandbox Code Playgroud) android audio-recording video-recording mediarecorder android-mediarecorder
我有一个尝试创建的方法AudioRecord.不同的手机支持不同的采样率,通道配置和音频格式.因此,该方法尝试AudioRecord为每个方法创建一个并返回第一个有效的方法.
private AudioRecord getAudioRecord() {
for (int rate: sampleRates) {
for (int audioFormat: audioFormats) {
for (int channelConfig: channelConfigs) {
String description = rate + "Hz, bits: " + audioFormat
+ ", channel: " + channelConfig;
Log.d(TAG, "Trying: " + description);
int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize == AudioRecord.ERROR
|| bufferSize == AudioRecord.ERROR_BAD_VALUE) {
Log.d(TAG, "Failed: This rate/channel config/format is not supported");
continue;
}
AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize);
if …Run Code Online (Sandbox Code Playgroud) 我正在写一个相机应用程序,我遇到了S3的问题.每当我开始录制时,显示屏都会变成垃圾(见下面的截图).然后,当我停止录制时,我得到一个例外:
10-02 13:36:31.647: E/MediaRecorder(24283): stop failed: -1007
10-02 13:36:31.647: D/AndroidRuntime(24283): Shutting down VM
10-02 13:36:31.647: W/dalvikvm(24283): threadid=1: thread exiting with uncaught exception (group=0x40c49a68)
10-02 13:36:31.647: E/AndroidRuntime(24283): FATAL EXCEPTION: main
10-02 13:36:31.647: E/AndroidRuntime(24283): java.lang.RuntimeException: stop failed.
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.media.MediaRecorder.native_stop(Native Method)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.media.MediaRecorder.stop(MediaRecorder.java:742)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.stopRecording(NewCameraActivity.java:178)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.toggleRecording(NewCameraActivity.java:189)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.onClick(NewCameraActivity.java:97)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.view.View.performClick(View.java:3565)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.view.View$PerformClick.run(View.java:14165)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Handler.handleCallback(Handler.java:605)
10-02 13:36:31.647: E/AndroidRuntime(24283): at …Run Code Online (Sandbox Code Playgroud) 我需要录制视频并保存它但是我在start()媒体记录器的方法上出错:失败 - 19(这个错误应该是什么?在文档中没有评论:()我正在与这个错误争论第二一天,我尝试了多个代码(谷歌教程,英特尔样本......)我在网上找到了,但无法完成任何工作.请帮助我找到导致问题的原因.我甚至开始怀疑我的手机(SE直播,wt19i)是否能够录制视频(但默认的相机应用程序工作正常).真的,拜托,有没有人知道我应该尝试/检查/修复什么?
这是我的录音代码:
public boolean record()
{
// if already recording, return
if( recording ) return false;
// We are recording
recording = true;
// log start of the method
System.out.println("CameraPreview::record() - Method start");
// Have tried to stop preview before record - didnt help
//mCamera.stopPreview();
mCamera.unlock();
mRecorder = new MediaRecorder();
// have tried this listener to get some extra info (doesnt work)
mRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
public void onError(MediaRecorder mr, int …Run Code Online (Sandbox Code Playgroud) 我想在Linux中使用SOX混合音频。这是我的剧本。我是这个东西的初学者。
time sox --buffer 128000 --combine mix audio1.mp3 audio_recorded.wav -C 64.0 "./Mixed.mp3"
time ffmpeg -loglevel warning -i ./Output.wav -c:a libfdk_aac -b:a 64k -map 0:0 -f segment -segment_time 10 -segment_list ./Output.m3u8 -segment_format aac './stream%03d.aac'
cd ..
Run Code Online (Sandbox Code Playgroud)
但是结果是这样的。
sox FAIL formats: can't open input file `audio_recorded.wav': WAVE: RIFF header not found
real 0m0.003s
user 0m0.000s
sys 0m0.002s
Run Code Online (Sandbox Code Playgroud)
该audio_recorded.wav是Android的一个录制的音频文件。
[已删除的ANDROID代码:不再需要]
更新:我试图将我的录音机..set比特率和采样率修改为audio1.mp3。然后我尝试将其混合。现在发生了什么:
[root@app complete]# bash test_mix.sh
sox WARN mp3-util: MAD lost sync
sox WARN mp3-util: recoverable MAD error
sox WARN mp3-util: recoverable …Run Code Online (Sandbox Code Playgroud) 我正在尝试录制一段10秒钟的视频进行监控.在Android中使用MediaRecorder非常简单.我所要做的就是打电话
mediaRecorder.setMaxDuration(10000);
Run Code Online (Sandbox Code Playgroud)
但是,我想连续覆盖相同的10秒视频.同样,这是一项微不足道的任务.
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
switch (what) {
case MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:
stopRecording();
startRecording();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
停止和启动(重新设定)MediaRecorder大约需要两秒钟.如果在这两秒钟内发生了重要事情,我就不会记录下来.
因此,我通过使用LocalSocket跟踪其他几个具有相同问题的人,并将其描述符传递给MediaRecorder
mediaRecorder.setOutputFile(sender.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)
然后是一个包含LocalServerSocket和接收器LocalSocket的AyncTask
public class VirtualServer extends AsyncTask<Void, Void, Void> {
...
server = new LocalServerSocket(SOCKET_ADDRESS);
while (true) {
receiver = server.accept();
...
int len = 0;
byte[] data = new byte[1024];
while ((len = input.read(data)) >= 0) {
...
Run Code Online (Sandbox Code Playgroud)
看看这是怎么回事?一旦解决了,就会出现一个新问题,在StackOverflow上也会多次解决.问题是传递给MediaRecorder的文件描述符不可搜索.
对我而言,这是我的理解停止的地方.不幸的是,没有明确的问题描述.如果有人可以向我描述问题,我可以开始寻找解决方案.有些地方提到"moot"必须重新定位,但随后讨论会转向一般的mp4编码,我迷失在所有细节中.
我希望我的问题得到明确说明.我不想播放任何形式的视频.深入研究打包成RTP并尝试提取我真正需要的部分的代码让我更加困惑.
我已经看过的链接:
干杯.
android video-encoding mpeg-4 mediarecorder android-mediarecorder
mMediaRecorder = new MediaRecorder();
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
// activate this for recording with sound\
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoSize(getMaxSupportedVideoSize().width,getMaxSupportedVideoSize().height);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// Step 4: Set output file
mMediaRecorder.setOutputFile(getOutputMediaFile("movie"));
// Step 4: Set output file
mMediaRecorder.setOutputFile(getOutputMediaFile("movie"));
// Step 5: Set the preview output
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mMediaRecorder.setOrientationHint(90);
Run Code Online (Sandbox Code Playgroud)
以上代码工作正常但是,视频的质量与我在本机安卓摄像头拍摄的视频不一样,我使用媒体录像机录制的视频质量较差,与原生录像机相比,我怎样才能提高视频质量.
如果有人知道帮助我.谢谢
我想在SurfaceView中看到我正在录制的视频,如果重新编写完成,我想在同一个SurfaceView中重放视频.即使我认为这将是Apps中的常见功能,但我找不到任何示例,也无法使我的代码工作.
private void prepareRecorder() {
try {
recorder = new MediaRecorder();
recorder.setPreviewDisplay(holder.getSurface());
camera.unlock();
recorder.setCamera(camera);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
recorder.setProfile(camcorderProfile);
File newFile = new File(videoFilePath);
recorder.setOutputFile(newFile.getAbsolutePath());
try {
recorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}catch(Exception e){
releaseCamera();
}
}
Run Code Online (Sandbox Code Playgroud)
//
public void onClick(View v) {
if(mediaPlayer!=null) {
mediaPlayer.reset();
mediaPlayer.release();
}
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(videoFile.getAbsolutePath());
SurfaceView surfaceView = (SurfaceView) getView().findViewById(R.id.videoInvitationFragSurfaceView);
mediaPlayer.setSurface(surfaceView.getHolder().getSurface());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) …Run Code Online (Sandbox Code Playgroud) android surfaceview android-mediaplayer android-mediarecorder
我想将手机中的数据与录制视频所花费的时间进行同步。我想获取有关录制视频所用时间的信息(以毫秒为单位)。我尝试通过以下方法解决该问题:
1.运行计时。
伪:
mMediaRecorder.start(); //start recording
startTime = System.currentTimeMillis(); //save start recording time
timerHandler.postDelayed(timerRunnable, 0); //for save elapsed time and timerHandler.postDelayed(this, 20); for next 20ms
Run Code Online (Sandbox Code Playgroud)
但是MediaRecorder存在问题,因为真实记录不会在MediaRecorder.start()之后立即开始,但是真实视频记录具有不同的延迟(取决于设备,...)。当MediaRecorder真正开始录制时,我需要“一些”回调或catch事件。
不需要有关停止录制的信息,因为我可以通过以下方式检查实际视频时长:
FileInputStream stream = new FileInputStream(storage.getVideoFile());
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(stream.getFD());
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
Run Code Online (Sandbox Code Playgroud)
我尝试在录制时通过MediaMetadataRetriever获取实际持续时间,但它仅适用于关闭的视频文件。
我试图通过FileObserver和onEvent进行检测,但这是准确的。
如果可能的话,我想通过Android SDK解决。但是如何?
[最小SDK:API21]
谢谢。
我正在使用谷歌样本'android-Camera2Video':
https://github.com/googlesamples/android-Camera2Video
问题是,当应用程序完成录制时,有时会卡住片刻,然后使用1 - ' ERROR_CAMERA_IN_USE '错误代码调用CameraDevice.StateCallback的onError()处理程序.
它不会每次都发生,它发生在大约90%的情况下,有时一切正常,没有错误.我无法找出它取决于什么以及如何解决这个问题.如果有人以前遇到过这个问题,请帮忙.