Video mit MediaCodec und MediaMuxer aufnehmen, aber Bitrate und Bildrate sind falsch

Ich habe eine Demo geschrieben, um ein Video mit MediaCodec und MediaMuxer aufzunehmen.

Ich nehme ein Video mit meiner Demo auf und überprüfe das Video mit ffprobe. Das Ergebnis ist wie folgt:

  Duration: 00:00:06.86, start: 0.000000, bitrate: 723 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 320x240, 619 kb/s, SAR 1:1 DAR 4:3, 30.02 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
  creation_time   : 2015-06-05 13:19:24
  handler_name    : VideoHandle
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 96 kb/s (default)
Metadata:
  creation_time   : 2015-06-05 13:19:24
  handler_name    : SoundHandle

Enthält Video- und Audioinformationen. Ich habe festgestellt, dass die Audioeigenschaften mit denen im Quellcode übereinstimmen, die Videoeigenschaften jedoch nicht in Ordnung sind. Der Quellcode für meine Videoeinstellungen lautet wie folgt:

        MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
    format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
            MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 384000);
    format.setInteger(MediaFormat.KEY_FRAME_RATE, 19);
    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
    if (VERBOSE) Log.d(TAG, "format: " + format);
    mVideoEncoder = MediaCodec.createEncoderByType(MIME_TYPE);
    mVideoEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    mInputSurface = mVideoEncoder.createInputSurface();
    mVideoEncoder.start();

Breite und Höhe des Videos stimmen, aber Bitrate und Framerate sind höher als im Quellcode angegeben. Dies hat zur Folge, dass die Videodatei viel größer ist als erwartet. Dann habe ich meinen Quellcode geändert, um den Audioaufnahmethread zu entfernen und nur das Video aufzunehmen. Aber es hat keinen Unterschied gemacht, die Bitrate und Framerate sind auch höher. Wer kann mir den Grund nennen und mir einige Ratschläge geben?

Und es gibt ein anderes Problem. Ich nehme gelegentlich ein defektes Video auf, das vom Systemplayer wiedergegeben werden kann, aber der Anfang des Videos ist nur schwarz und nach 1 oder 2 Sekunden wird ein normales Bild angezeigt. Ich weiß nicht, wie ich eine Datei in stackoverflow hochladen soll. Ich kann die kaputte Videodatei an jeden senden, der sie benötigt. Ist da jemand mit diesem Problem gekommen?

ADD : Ich habe eine andere seltsame Sache gefunden: Meine Videokodierungskonfiguration:

private int mWidth = 480;
private int mHeight = 848;
private int mVideoBitrate = 1200 * 1000;

    MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, 480, 848);

    format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
            MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 1200000);
    format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);

aber die eigentlichen Videoinformationen sind:

  Duration: 00:00:06.01, start: 0.000000, bitrate: 6491 kb/s
Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 15 kb/s (default)
Metadata:
  creation_time   : 2015-09-30 15:44:18
  handler_name    : SoundHandle
Stream #0:1(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 480x848, 6484 kb/s, SAR 1:1 DAR 30:53, 16 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
  creation_time   : 2015-09-30 15:44:18
  handler_name    : VideoHandle

Antworten auf die Frage(2)

Ihre Antwort auf die Frage