一、问题描述

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 ,在评论区发一下完整日志。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐