Lösen Sie das Problem, dass das Video aufgrund eines ungewöhnlichen Stromausfalls oder eines APK-Absturzes beim Aufnehmen von Videos auf Android nicht abgespielt werden kann

Problembeschreibung

Android zeichnet MP4-Videos (h264+acc) auf. Wenn das Gerät ungewöhnlich ausgeschaltet ist, kann die APK die Aufnahme nicht normal schließen;

Problemanalyse

Longitude Niang analysierte, dass die aufgezeichnete Videodatei nicht normal geschlossen werden konnte und einige Moov-Boxen fehlten, was dazu führte, dass das Video nicht richtig abgespielt wurde;

Lösung

Fügen Sie hier eine Bildbeschreibung einNach Überprüfung der von Du Niang vorgelegten Pläne stellte sich heraus, dass keiner von ihnen den Anforderungen entsprach oder nicht einfach zu bedienen war. Schließlich besprach ich mit meinen Kollegen und beschloss, das aufgezeichnete Videoformat direkt in TS-Dateien umzuwandeln. Nachdem Sie die Logik erneut überprüft haben, liegt kein Problem vor. Laden Sie dann den Code hoch.

package com.example.demo;

import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.hardware.camera2.CameraAccessException;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Surface;

import androidx.appcompat.app.AppCompatActivity;

import com.zlmediakit.jni.ZLMediaKit;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private  MediaRecorder mediaRecorder;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initMediaRecorder();
    }
    
    private void initMediaRecorder() {
        //new SurfaceTexture
        Camera mCamera = Camera.open(0);
        Camera.Parameters params = mCamera.getParameters();
        params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
        mCamera.setParameters(params);
        SurfaceTexture surfaceTexture = new SurfaceTexture(0);
        try {
            mCamera.setPreviewTexture(surfaceTexture);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        mCamera.startPreview();
        mCamera.unlock();


        mediaRecorder = new MediaRecorder();
        mediaRecorder.setCamera(mCamera);
        mediaRecorder.reset();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);           // 设置麦克风获取声音
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);        // 设置摄像头获取图像
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);   // 设置 ts 格式
        mediaRecorder.setVideoSize(1920, 1080);
        mediaRecorder.setVideoEncodingBitRate(2*1024*1024);// 2M 码率
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);  

        File f = new File(MainActivity.this.getExternalFilesDir(null).getAbsolutePath() + "/video");
        if (!f.exists()) f.mkdirs();
        String p = f.getAbsolutePath() + "/" + System.currentTimeMillis() + ".ts";
        Log.e(TAG, "initMediaRecorder   录制路径: " + p);

        mediaRecorder.setOutputFile(p);                   // 设置视频输出路径
        mediaRecorder.setPreviewDisplay(new Surface(surfaceTexture)); // 设置使用SurfaceView预览视频
        mediaRecorder.setOrientationHint(90);                                  // 调整播放视频角度
        try {
            mediaRecorder.prepare();                                           // 准备录像
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("WillWolf", "mediaRecorder-->录制异常:" + e.toString());
        }
        mediaRecorder.start();
        handler.sendEmptyMessageDelayed(1, 10 * 1000);
    }

    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == 1) {
                mediaRecorder.stop();
                mediaRecorder.reset();
                mediaRecorder.release();
                mediaRecorder = null;
                initMediaRecorder();
            }
            return false;
        }
    });
}

Hinweis 1: Sie müssen über Kamera-, Audio- und Lese- und Schreibberechtigungen für Dateien verfügen (das Lesen von Dateien ist optional).

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />

Hinweis 2: Sie können setMaxDuration hier nicht direkt zum Aufzeichnen von Videosegmenten verwenden. Weitere Informationen finden Sie in der offiziellen Einführung. Sie können es gemäß dem oben veröffentlichten Code implementieren. Diese Lösung ist jedoch nicht perfekt und kann zu Bildverlusten führen. Zu diesem Problem habe ich den folgenden Du Niang gefragt: Es gibt eine Lösung. Weitere Informationen finden Sie unter: Big Brother's Blog

Supongo que te gusta

Origin blog.csdn.net/qq_35350654/article/details/130382227
Recomendado
Clasificación