GStreamer 管道冻结故障排除

Troubleshoot GStreamer pipeline freezing

目前我正在开发 android 应用程序,它将播放和录制来自远程源的视频

我的管道是这样的

videotestsrc do-timestamp=true ! videoscale add-borders=false ! capsfilter ! videoflip method=0 ! tee name=split 
    split. ! queue ! videoconvert ! glupload ! glshader ! autovideosink async=false !
    split. ! queue ! identity drop-probability=0 ! videoconvert ! timeoverlay ! x264enc key-int-max=10 ! h264parse ! splitmuxsink location=/sdcard/test-%d.mp4

我在日志中看到的唯一问题统计数据

video_buffer_pool_set_config:<videobufferpool1> no caps in config

我不是要修复我的管道,我只是想了解它有什么通用算法如何解决这种冻结问题?

您将拥有的最好的工具可能是 gstdebugutils.h 中的 GST_DEBUG_BIN_TO_DOT_FILE 宏。它将显示您的管道和每个元素的状态。它确实需要您设置 GST_DEBUG_DUMP_DOT_DIR 环境变量。

然后你 运行 这样的命令从点创建 PNG 或其他图像文件。

dot -Tpng pipeline.dot -o pipeline.png

在我们的桌面系统上,我们通常将所有这些打包成一个命令,我们可以将其添加到我们的程序中。我不确定 Android 中的最佳路线是什么。也许那里有一些额外的 API 可以提供帮助。

确定问题元素后,使用 GST_DEBUG 环境变量添加额外的日志记录。例如,如果您有 x264enc 错误,请使用:

GST_DEBUG=2,x264enc:5

这会将除 x264enc 之外的所有内容的日志记录级别设置为错误,它将是调试级别。

此外,如果您 运行 是调试器,您通常可以查看所有线程并找出挂起的元素。