【问题标题】:Wrong DURATION in MediaStore.Video.Media.DURATIONMediaStore.Video.Media.DURATION 中的 DURATION 错误
【发布时间】:2015-02-11 10:09:10
【问题描述】:

我正在尝试在我的应用程序中录制视频,但我注意到在显示其持续时间时,我看到了错误的分钟\秒。只有通过以下代码录制的视频才会发生这种情况。通过其他应用录制的视频,时长显示正确:

 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);

【问题讨论】:

    标签: android video cursor duration mediastore


    【解决方案1】:

    这样解决:

        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 属性中。

    【讨论】:

    • 为什么在 intilliJ IDE 上显示MediaStore.Video.Media.DURATION 需要 android Q 的警告?
    • @HamzehSoboh MediaStore.Video.Media.DURATION 警告是文档错误。不重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2015-10-14
    相关资源
    最近更新 更多