MediaStore.Video.Media.DURATION 中的 DURATION 错误
Wrong DURATION in MediaStore.Video.Media.DURATION
我正在尝试在我的应用程序中录制 视频,我注意到显示他们的 duration,我看到了错误的分钟数\秒。只有通过以下代码录制的视频才会发生这种情况。通过其他应用录制的视频,时长显示正确:
public void recordStream() {
//Release Camera before MediaRecorder start
releaseCamera();
if(!prepareMediaRecorder()){
Toast.makeText(MainActivity.this,
"Fail in prepareMediaRecorder()!\n - Ended -",
Toast.LENGTH_LONG).show();
}
mediaRecorder.start();
}
}
private boolean prepareMediaRecorder(){
myCamera = getCameraInstance();
mediaRecorder = new MediaRecorder();
myCamera.stopPreview();
myCamera.unlock();
mediaRecorder.setCamera(myCamera);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
mediaRecorder.setAudioChannels(profile.audioChannels);
mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);
mediaRecorder.setVideoEncoder(profile.videoCodec);
mediaRecorder.setAudioEncoder(profile.audioCodec);
}
//String outputfilename;
Date date=new Date();
outputfilename="/sdcard/video/"+date.toString().replace(" ", "_").replace(":", "_")+".mp4";
mediaRecorder.setOutputFile(outputfilename);
mediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
try {
mediaRecorder.prepare();
} catch (IllegalStateException e) {
releaseMediaRecorder();
return false;
} catch (IOException e) {
releaseMediaRecorder();
return false;
}
return true;
}
这是我从视频中获取时长的方法:
video_column_index = videocursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
videocursor.moveToPosition(position);
long duration = videocursor.getLong(video_column_index);
String converted = String.format("%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(duration),
TimeUnit.MILLISECONDS.toSeconds(duration) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration))
);
holder.txtDuration.setText(converted);
这样解决的:
MediaPlayer mp = MediaPlayer.create(this, Uri.parse(outputfilename));
int duration = mp.getDuration();
mp.release();
ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.DATA, outputfilename);
values.put(MediaStore.Video.Media.DATE_TAKEN, dateTaken);
values.put(MediaStore.Video.Media.DURATION, duration);
需要计算视频时长并将其添加到 MediaStore 属性中。
我正在尝试在我的应用程序中录制 视频,我注意到显示他们的 duration,我看到了错误的分钟数\秒。只有通过以下代码录制的视频才会发生这种情况。通过其他应用录制的视频,时长显示正确:
public void recordStream() {
//Release Camera before MediaRecorder start
releaseCamera();
if(!prepareMediaRecorder()){
Toast.makeText(MainActivity.this,
"Fail in prepareMediaRecorder()!\n - Ended -",
Toast.LENGTH_LONG).show();
}
mediaRecorder.start();
}
}
private boolean prepareMediaRecorder(){
myCamera = getCameraInstance();
mediaRecorder = new MediaRecorder();
myCamera.stopPreview();
myCamera.unlock();
mediaRecorder.setCamera(myCamera);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
mediaRecorder.setAudioChannels(profile.audioChannels);
mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);
mediaRecorder.setVideoEncoder(profile.videoCodec);
mediaRecorder.setAudioEncoder(profile.audioCodec);
}
//String outputfilename;
Date date=new Date();
outputfilename="/sdcard/video/"+date.toString().replace(" ", "_").replace(":", "_")+".mp4";
mediaRecorder.setOutputFile(outputfilename);
mediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
try {
mediaRecorder.prepare();
} catch (IllegalStateException e) {
releaseMediaRecorder();
return false;
} catch (IOException e) {
releaseMediaRecorder();
return false;
}
return true;
}
这是我从视频中获取时长的方法:
video_column_index = videocursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
videocursor.moveToPosition(position);
long duration = videocursor.getLong(video_column_index);
String converted = String.format("%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(duration),
TimeUnit.MILLISECONDS.toSeconds(duration) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration))
);
holder.txtDuration.setText(converted);
这样解决的:
MediaPlayer mp = MediaPlayer.create(this, Uri.parse(outputfilename));
int duration = mp.getDuration();
mp.release();
ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.DATA, outputfilename);
values.put(MediaStore.Video.Media.DATE_TAKEN, dateTaken);
values.put(MediaStore.Video.Media.DURATION, duration);
需要计算视频时长并将其添加到 MediaStore 属性中。