Android Mediarecorder:获取3GP而不是MPEG4

时间:2012-02-02 10:27:34

标签: java android audio-recording video-recording

我想只在带有MPEG4格式的android中录制视频。我希望容器和编解码器是MPEG4。所以这就是我为此所做的。

Thread video = new Thread(new Runnable() {
    public void run() {
        videoRecorder = new MediaRecorder();
        videoRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
        videoRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        videoRecorder.setVideoEncodingBitRate(56 * 8 * 1024);
        videoRecorder.setVideoSize(176, 144);
        videoRecorder.setVideoFrameRate(12);
        videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        videoRecorder.setOutputFile("/sdcard/video.m4e");
        try {
            videoRecorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        videoRecorder.start();
    }
});
video.start();

现在,录制完成后,我将视频录制到video.m4e文件中。但是当我检查它的信息时,我得到了以下内容:

enter image description here

同时我使用以下内容录制音频:

Thread audio = new Thread(new Runnable() {              
    public void run() {
        audioRecorder = new MediaRecorder();
        audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
        audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        audioRecorder.setOutputFile("/sdcard/audio.amr");
        try {
            audioRecorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        audioRecorder.start();
    }
});
audio.start();

我按照预期将容器格式和编解码器作为AMR:

enter image description here

那么,是什么导致MediaRecorder以3GP格式录制视频?我的程序中没有指定3GP。我正在运行Android 2.2的Samsung Galaxy选项卡上测试此代码

3 个答案:

答案 0 :(得分:7)

MPEG-4是一种定义音频和视频(AV)数字数据压缩的方法。
一种用于存储基于时间的媒体内容的文件格式。它是形成许多其他更具体的文件格式(例如3GP,Motion JPEG 2000,MPEG-4 Part 14)的基础的一般格式。

因此,你得到的结果没有阴谋,您使用的压缩方法(或“编解码器”)是MPEG4,手机生成的视频格式为3gp,实际上是媒体MPEG4压缩方案套件的视频格式的一部分。

答案 1 :(得分:0)

这是由框架定义的。具体来说,它有一组参数,可在MediaRecorder类中找到,用于定义所有支持的参数。

答案 2 :(得分:0)

我不明白akkilis的解释。

在官方Android教程"MediaRecorder.OutputFormat"中, MPEG_4是“媒体文件格式”的选项之一,与THREE_GPP并行。 int AAC_ADTS AAC ADTS文件格式 int AMR_NB AMR NB文件格式 int AMR_WB AMR WB文件格式 int DEFAULT
int MPEG_4 MPEG4媒体文件格式 int RAW_AMR此常量在API级别16中已弃用。不推荐使用MediaRecorder.OutputFormat.AMR_NB int THREE_GPP 3GPP媒体文件格式

还有另一个参数来指定编码格式: "MediaRecorder.VideoEncoder"

int DEFAULT
int H263
int H264
int MPEG_4_SP

在OP的代码中,他指定了文件格式和编码格式。

  

videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);   videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

所以似乎akkilis的解释对这个例子不起作用。