如何转换内置 Android 摄像头录制的视频的编解码器?

How to convert codec of video recorded by inbuilt Android camera?

我使用android的内置摄像头录制视频,但是当我通过Retrofit2发送到服务器时,在browser.So搜索了很长时间后看不到视频,我知道视频我用 android 录制,编解码器是 MP42 所以我需要将它转换成 H.264 编解码器才能在浏览器中播放。

这是我拍摄视频的方式

 private void recordVideo() {

        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

        fileUri = getOutputMediaFileUri();
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
        intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT,15);
        startActivityForResult(intent, REQUEST_VIDEO_CAPTURE);
    }

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == RECORD_VIDEO_PERMISSION && resultCode == RESULT_OK){
            Uri uri =data.getData(); //so the video file I get it here 
            Log.d("videoData",data.getData().toString());
            videoView.setVideoURI(uri);
            videoView.start();
        }
    }

我在 onActivityResult 中获取了视频的 uri,视频在 MP42 编解码器中,如何将其转换为 H.264

我尝试使用 MediaCodec Documentation,但我不知道在哪里输入我的 Uri (mp42) 以获得 H.264 编解码器视频的输出(我想在浏览器中播放) .

有人请给我一些指导..

(1) 修复当前视频文件:

您的视频格式为 H.263(或 Mpeg-2),使用 Simple 配置文件。正如您所说,这意味着您必须转换。您必须使用一些免费的视频工具重新编码到 H.264 任务中。

例如:使用 Handbrake 你可以做...

  • 选择打开您的 "not playing" MP4 文件。应该被检测为 MP4,现在勾选(或启用)选项 web optimized.

  • Video设置选项卡中,选择编码器Profile作为Main,选择编码器level作为3.

  • Destination 中输入您的首选输出文件夹和文件名。
    (只需浏览到某个文件夹,然后在此处输入您要创建的新文件名)。

  • 单击绿色按钮 Start Encode 并在浏览器中测试新的 MP4 输出文件。

(2) 修复 Android 代码以供将来录制:

您必须在 MediaRecorder 对象设置中将编解码器设置为 H.264,例如:

myMediaRec = new MediaRecorder(); //create MediaRecorder object
myMediaRec.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //set video codec

所以基本上您的代码应该如下所示:(未经测试的代码,仅用于学习或指导)...

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    if(requestCode == RECORD_VIDEO_PERMISSION && resultCode == RESULT_OK)
    {
        //# Create a new instance of MediaRecorder
        myMediaRec = new MediaRecorder(); //create MediaRecorder object
        mMediaRec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        myMediaRec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

        //# Video settings
        myMediaRec.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //contained inside MP4
        myMediaRec.setVideoSize(640, 480); //width 640, height 480
        myMediaRec.setVideoFrameRate(30);  //30 FPS
        myMediaRec.setVideoEncodingBitRate(3000000); //adjust this for picture quality

        //# Audio settings
        myMediaRec.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //must always be AAC
        myMediaRec.setAudioEncoder(MediaRecorder.getAudioSourceMax());
        myMediaRec.setAudioEncodingBitRate(16);
        myMediaRec.setAudioSamplingRate(44100);

    }
}