雪飘碧鸳 2023-01-31 10:24 采纳率: 0%
浏览 15

Android使用MediaMuxer合并h264+aac音频流,非正常结束不能播放

在Android平台上,使用MediaMuxer合并实时的音视频流,h264+aac流,如果是正常地结束,即调用

mMediaMuxer.stop()
如上面所示,调用这个方法,生成的mp4文件才能播放。

但是,如果突然断电,或者app闪退崩了,那就没有正常地调用stop方法,那这个文件就播放不了了。

有人知道怎样能更好地实现h264视频流+aac音频流合并成mp4的方法或SDK吗,即使app闪退或断掉电等极端情况,也能播放到非正常结束前一两秒的方法

  • 写回答

4条回答 默认 最新

  • m0_54204465 2023-01-31 10:56
    关注

    可以尝试使用FFmpeg来合并h264+aac流。FFmpeg在极端情况下依然能生成可播放的视频,并且FFmpeg在Android平台上也有对应的库可以使用。

    另外,可以考虑在合并视频的过程中加入错误处理逻辑,例如写入记录文件,捕获异常,记录错误状态等,以确保生成的文件可以播放。如何使用try-catch语句处理异常:

    try {
        // 合并音视频流的代码
        // ...
    } catch (Exception e) {
        // 记录错误状态
        Log.e("MediaMuxer", "Error merging video and audio streams", e);
    } finally {
        // 关闭资源
        // ...
    }
    
    

    这样,即使在合并音视频流的过程中发生异常,仍然可以通过捕获异常并记录错误状态来保证生成的文件可以播放。
    还可以考虑使用其他的多媒体合并工具,例如Gstreamer,它支持多种流媒体格式,也可以在Android上使用,并且具有较强的稳定性。

    此外,还可以通过缓存数据,在app恢复正常运行后继续处理未完成的任务,以确保最终生成的文件完整。

    // 定义缓存文件路径
    private static final String CACHE_FILE = "video_cache.bin";
    
    // 定义缓存数据
    private void cacheData(byte[] data) {
        try {
            FileOutputStream fos = new FileOutputStream(CACHE_FILE, true);
            fos.write(data);
            fos.close();
        } catch (Exception e) {
            Log.e("Cache", "Error caching data", e);
        }
    }
    
    // 恢复缓存数据
    private byte[] recoverData() {
        try {
            FileInputStream fis = new FileInputStream(CACHE_FILE);
            byte[] data = new byte[fis.available()];
            fis.read(data);
            fis.close();
            return data;
        } catch (Exception e) {
            Log.e("Cache", "Error recovering data", e);
            return null;
        }
    }
    
    // 合并音视频流的代码
    private void mergeStreams() {
        try {
            // 合并音视频流的代码
            // ...
        } catch (Exception e) {
            // 缓存数据
            cacheData(data);
        } finally {
            // 关闭资源
            // ...
        }
    }
    
    // app恢复正常运行时继续处理未完成的任务
    private void onAppResume() {
        // 恢复缓存数据
        byte[] data = recoverData();
        if (data != null) {
            mergeStreams();
        }
    }
    
    

    即使在合并音视频流的过程中发生异常,仍然可以通过缓存数据,在app恢复正常运行后继续处理未完成的任务,以确保最终生成的文件完整。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月31日

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因