OpenHarmony 视频录制反复暂停恢复出现录制失败问题处理

一、问题描述

OpenHarmony 录制应用调用AVRecorder接口进行视频录制时,如果反复调用暂停和恢复录制的接口,会出现录制失败的情况,AVRecorder上报错误信息,录制的文件无法播放等。

二、复现方法

1、版本环境:OpenHarmony-4.1-Release、OpenHarmony-4.0-Release、OpenHarmony-3.2-Release
2、应用环境:录制应用设置AVRecorder的录制参数:VideoSourceType=1(VIDEO_SOURCE_SURFACE_ES),从surface传递给AVRecorder的输入数据是h264 es数据
3、录制失败的log中会有如下打印,音视频pts差异大于2s:

W C02b2b/splitmuxsink: {check_completed_gop():2760} [gst::MuxSinkBin:F1C0D0] error: Timestamping error on input streams
W C02b2b/splitmuxsink: {check_completed_gop():2760} [gst::MuxSinkBin:F1C0D0] error: Context 0x7fa1ade330 sink pad <queue_audio_0:sink> running time +0:13:01.638298898, next gop start: +0:13:05.685712872, diff +0:00:04.047413974

三、修改方法

1、OpenHarmony-4.1-Release 以前的版本首先需要同步下面这一笔提交

https://gitee.com/openharmony/multimedia_player_framework/commit/266c5c586740d47fcabbdf7d6dc1bbbef526784b

2、修改 foundation/multimedia/player_framework/services/engine/gstreamer/plugins/source/videocapture/src/gst_video_capture_src.cpp
的gst_video_capture_src_pause 函数

static void gst_video_capture_src_pause(GstVideoCaptureSrc *src)
{
    ...
    src->cur_state = RECORDER_PAUSED;
    src->paused_count++;

    GstBufferPool *bufferpool = GST_BUFFER_POOL(surfacesrc->pool);

-   if (src->stream_type != VIDEO_STREAM_TYPE_ES_AVC) {
        gst_buffer_pool_set_flushing(bufferpool, TRUE);
        gst_buffer_pool_set_flushing(bufferpool, FALSE);
-   }
    GST_DEBUG_OBJECT(src, "video capture src pause");
}

删除前面标记“-”的两行。VIDEO_SOURCE_SURFACE_ES录制模式下暂停录制时也需要清空buffer pool。

四、结语

如上修改后本人camera录像测试间隔3s不停暂停恢复录像5分钟以上未复现问题。
如果录制时不停暂停恢复还有问题,可以设置系统属性复现 param set sys.media.log.level *:D;param set hilog.loggable.global D ,在评论区发一下完整日志。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值