Android Camera2画面黑屏,录像仅1秒

Posted

技术标签:

【中文标题】Android Camera2画面黑屏,录像仅1秒【英文标题】:Android Camera2 picture is black and video records only 1sec 【发布时间】:2016-06-18 01:07:39 【问题描述】:

借助您可以在此处找到的两个示例,我正在使用 Camera2 API:

GitHub - Camera2Video GitHub - Camera2Basic

我使用与上述链接相同的源代码,因此我不会在此处复制我的源代码(除非您需要某些部分,否则我将编辑我的问题并发布它)。

编辑:

进行了一些测试。当我尝试通过手机播放视频时,它只显示第一帧,我可以听到录音中实际存在的音频(声音)。视频播放到结束后,视频会以某种方式自动重新启动并按应有的方式显示视频。

但是,当我尝试在我的 PC 上播放视频(将其从手机复制到桌面)时,直到最后一帧我才会出现黑屏。显示最后一帧,但视频根本不播放。我可以听到音频(声音)。

我在想可能是某些视频编码/解码有问题?

问题:

在我的情况下,视频录制不起作用。一世 可以在他们应该在我的手机上的目录中看到这两个文件, 但是当我播放视频时 (5 秒视频)前 4 秒是黑色的,然后最后一秒就像 我录制的一帧就是这样,但文件大小似乎很大(160MB)。

屏幕:

上传后会发布视频

不知道怎么回事,有大神帮忙吗?

【问题讨论】:

我设法纠正了我在拍照方面的一些错误。但是,我现在导入了 Camera2Video 示例,问题是一样的。因此,Camera2Video 的源示例中可能有问题。我会试着找出什么。 嘿!您是否同时使用基本版和视频版?我在同一片段中使用两者时遇到问题。我不会在其中用户可以拍照或录制视频的单一视图。你能帮忙吗? 【参考方案1】:

这不是一个真正的解决方案,但它仍然完成了我想做的事情。

为了播放视频,我必须在我的 MediaRecorder 设置中完全禁用音频

        //mMediaRecorder.setAudiosource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setOutputFile(getVideoFile(activity).getAbsolutePath());
        mMediaRecorder.setVideoEncodingBitRate(10000000);
        mMediaRecorder.setVideoFrameRate(24);
        mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        //mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

你可以注意到我可以在哪里注释掉命令。一旦我这样做了,视频就会正常播放。

希望这个糟糕的解决方法仍然可以帮助那些在视频录制中也不需要音频的人。

【讨论】:

我也有同样的问题。我认为这与硬件有关;我在 Galaxy S7 上遇到问题,但在 Nexus 平板电脑上没有。分析视频文件,我发现帧速率和最小帧速率为 0 fps,即使我将帧速率设置为 30。android camera2 api galaxy s7【参考方案2】:

在某些设备上,特别是 Galaxy 系列、S7 等。媒体记录器为视频轨道提供了错误的时间戳。这会导致首先播放音频,然后播放视频。要解决此问题,您需要重新解析媒体记录器生成的输出并重写视频时间戳,从时间 0 开始。这将解决您在上面发布的音频视频同步问题。

【讨论】:

请提供一些关于如何重新解析输出的建议。【参考方案3】:

三星 Galaxy S7(我认为是 S6)有一个错误,会导致编码混乱。 解决方法是使用下面的函数重新编码。

请注意,您的 gradle 中需要此依赖项: 编译'com.googlecode.mp4parser:isoparser:1.1.22'

    public void fixSamsungBug()

    DataSource channel = null;
    try
    
        channel = new FileDataSourceImpl(app.dataMgr.videoFileURL);
     catch (FileNotFoundException e)
    
        e.printStackTrace();
    

    IsoFile isoFile = null;

    try
    
        isoFile = new IsoFile(channel);
     catch (IOException e)
    
        e.printStackTrace();
    

    List<TrackBox> trackBoxes = isoFile.getMovieBox().getBoxes(TrackBox.class);
    boolean sampleError = false;
    for (TrackBox trackBox : trackBoxes) 
        TimeToSampleBox.Entry firstEntry = trackBox.getMediaBox().getMediaInformationBox().getSampleTableBox().getTimeToSampleBox().getEntries().get(0);

        // Detect if first sample is a problem and fix it in isoFile
        // This is a hack. The audio deltas are 1024 for my files, and video deltas about 3000
        // 10000 seems sufficient since for 30 fps the normal delta is about 3000
        if(firstEntry.getDelta() > 10000) 
            sampleError = true;
            firstEntry.setDelta(3000);
        
    

    if(sampleError) 
        Log.d("gpinterviewandroid", "Sample error! correcting...");
        Movie movie = new Movie();
        for (TrackBox trackBox : trackBoxes) 
            movie.addTrack(new Mp4TrackImpl(channel.toString() + "[" + trackBox.getTrackHeaderBox().getTrackId() + "]" , trackBox));
        
        movie.setMatrix(isoFile.getMovieBox().getMovieHeaderBox().getMatrix());
        Container out = new DefaultMp4Builder().build(movie);

        //delete file first!
        File file = new File(app.dataMgr.videoFileURL);
        boolean deleted = file.delete();


        FileChannel fc = null;
        try
        
            //fc = new FileOutputStream(new File(app.dataMgr.videoFileURL)).getChannel();
            fc = new RandomAccessFile(app.dataMgr.videoFileURL, "rw").getChannel();
         catch (FileNotFoundException e)
        
            e.printStackTrace();
        

        try
        
            out.writeContainer(fc);
            fc.close();
         catch (IOException e)
        
            e.printStackTrace();
        

        Log.d("gpinterviewandroid", "Finished correcting raw video");
    

【讨论】:

那没有修复我的视频,你确定这有效吗?谢谢 问题是这段代码正在改变我的元数据。它是 MPEG 4,现在文件似乎已损坏。有什么解决办法吗?【参考方案4】:

此代码适用于我:

mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

【讨论】:

以上是关于Android Camera2画面黑屏,录像仅1秒的主要内容,如果未能解决你的问题,请参考以下文章

如何设置Android Camera2预览画面的帧率(FPS)?

[RK3568 Android11]Android应用录像帧数据处理

[RK3568 Android11]Android应用录像帧数据处理

Android Worklight应用程序中的启动画面后,黑屏会长时间出现

Android多媒体功能开发(14)——Camera2框架

利用Android Camera2 的照相机api 实现 实时的图像采集与预览