【问题标题】:How to record low quality video in mp4 format in android?如何在android中以mp4格式录制低质量视频?
【发布时间】:2015-09-21 10:36:25
【问题描述】:

我正在从相机录制低质量视频并将其上传到服务器。问题是录制的视频采用 3gp 格式。即使我给出带有 mp4 扩展路径的 EXTRA_OUTPUT 标志,它仍然会记录在 3gp 中。

实际上,在 iOS 设备上,这个 3gp 视频没有播放,我不想使用 ffmpeg 将其转换为 mp4,因为它有开销,而且转换需要时间。

这是我正在使用的代码:-

            ContentValues values = new ContentValues();
            String fileName = System.currentTimeMillis() + ".mp4";
            values.put(MediaStore.Video.Media.TITLE, fileName);
            values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
            try {
                Uri videoUriFromCamera = getContentResolver().insert(
                        MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
                Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, videoUriFromCamera);
                if (videoSize != -1)
                    intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, videoSize);
                if (videoDuration != -1)
                    intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, videoDuration);

                startActivityForResult(intent, ACTION_REQUEST_VIDEO_FROM_CAMERA);
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(VideoPickActivity.this, "SD-Card not available", Toast.LENGTH_LONG).show();
            }

有什么方法或标志可以让我使用默认相机意图以 mp4 格式或任何其他格式录制低质量视频?

【问题讨论】:

    标签: android


    【解决方案1】:

    没有。

    首先,ACTION_VIDEO_CAPTURE 上没有用于说明特定视频容器格式(例如 MP4)的额外记录。尝试询问的最佳方法是为文件传递Uri,其中文件扩展名为.mp4,但即使这样也只是一个希望。

    其次,有数以千计的相机应用宣传支持ACTION_VIDEO_CAPTURE,其中包括数百个预装的相机应用。没有人必须尊重您的任何额外内容。没有人需要注意文件扩展名来选择视频容器格式。

    如果您想要对视频录制进行这种程度的控制,请自己录制视频,例如使用MediaRecorder

    【讨论】:

    • “但即使这只是一个希望” - 我想知道这些答案是否合适? stackoverflow.com/questions/32883934/… , stackoverflow.com/questions/11361597/…
    • @DanielWilson:这些是“为文件传递 Uri,文件扩展名为 .mp4”。没有要求任何应用程序注意该文件扩展名。
    • 仔细观察后应该更具体。您如何看待@PKV 在第二个链接中的回答?这对我来说是合理的。 (S)他似乎从响应中的数据文件流创建了一个 MP4:InputStream in = getContentResolver().openInputStream(data.getData()),我希望这完全不同通过 MediaStore.EXTRA_OUTPUT 请求意图中的 mp4
    • @DanielWilson:这个答案更糟,就ACTION_VIDEO_CAPTURE is not documented to return a value而言,很少有相机应用程序可以使用该代码。它也不会解决问题。您正在调用第三方相机应用程序。该应用程序的开发人员可以为所欲为。这包括没有实际录制视频,更不用说没有以您想要的格式录制。如果您需要以特定格式录制视频,请自行录制。
    • 好吧,该死的。我知道第 3 方的意图可能很不稳定,我们不能保证有视频,但我想我至少能够大部分时间将视频转换为 Mp4,如果我确实得到了一个。我的选择似乎是使用该死的媒体记录器(我目前正在这样做,但它充满了奇怪的设备特定问题),或者可能转换我们服务器上的文件。我会做更多的研究,谢谢你的时间:)
    【解决方案2】:

    您可能需要更深入地了解使用相机的机制: 创建一个 MediaRecorder,并设置一个 CamcorderProfile,您可以通过一些技巧进行设置。

        mCamera = Camera.open();
        mRec = new MediaRecorder();
        mRec.setCamera(mCamera);
        mRec.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    
        CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
        mProfile.fileFormat = MediaRecorder.OutputFormat.MPEG_4;
        mRec.setProfile(mProfile);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2013-12-15
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多