1

我一直在努力让 VideoReader 在 Ubuntu 17.04 上运行。如果我运行一个简单的程序:

v = VideoReader('flame.avi')

我得到以下信息:

Error using VideoReader/init (line 619)

Could not read file due to an unexpected error. Reason: Unable to initialize the video obtain properties

Error in VideoReader (line 172)
        obj.init(fileName);

现在,我做了一点挖掘,大多数人都说这个错误来自没有安装 gstreamer0.10。

请参阅:https ://www.mathworks.com/matlabcentral/answers/165584-cannot-read-video-matlab-2014b-linux

这个说 gstreamer1.0 不足以解决这个问题:https ://www.mathworks.com/matlabcentral/answers/255157-can-t-load-video-using-videoreader-in-matlab-r2015-on -ubuntu-15-04-could-not-read-file-due-to-an-un

问题来自尝试安装 gstreamer0.10。它似乎不适用于 Ubuntu 17。

这一篇谈到 gstreamer 如何在 Ubuntu 17 上不起作用:https ://www.mathworks.com/matlabcentral/answers/294258-hello-i-have-a-problem-with-videoreader-on-matlab-r2016a-与-ubtuntu-lts16-04

我想知道是否有人对如何克服这个问题有任何想法?我可以安装一个不同的软件包来满足相同的要求吗?我已经尝试安装 matlab-support,但这也没有帮助。除了 gstreamer0.10 之外还有其他问题吗?

我不希望重新安装 Ubuntu 16.04,但要了解这是否是唯一的方法。但可以肯定的是,有人让 MATLAB 在 Ubuntu 17 上运行?

4

2 回答 2

4

我的一位同事找到了解决我的问题的帖子的链接https://www.mathworks.com/matlabcentral/answers/329796-issue-with-libstdc-so-6

本质上,您需要重定向 MATLAB 并告诉它不要使用其默认的 libstdc++6 文件,而是使用您的 Linux 系统。我采用了底部的解决方案,并为我的 .bashrc 文件编写了一个别名。

alias matlab='LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22 /usr/local/bin/matlab -desktop'

经过测试,我确认它可以工作。

于 2018-01-18T17:32:12.283 回答
0

我有完全相同的问题,我能够通过运行解决它

sudo apt install gstreamer1.0-plugins-*

在带有 MATLAB R2018a 的 Ubuntu 20.04 上

此外,强制 MATLAB 以方式 1. 和 2. 使用系统 libstdc++ 并没有解决问题:

  1. 写在~/.bashrc alias matlab='LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22 /usr/local/bin/matlab -desktop' 关闭终端,再次打开,运行matlab,仍然没有工作。

  2. /usr/local/MATLAB/R2018a/sys/os/glnxa64.bak 添加到所有 libstdc++ 文件(作为使它们对 matlab“不可见”并强制它在系统中查找它们的一种手段)也不起作用。

编辑 这至少适用于一个视频,但其他视频仍然给我同样的错误。所以这不是一个完整的解决方案

编辑

使用此脚本(使用 opencv)转换后,我无法使用 matlab 的视频阅读器打开的一个此类视频变得可访问。

import cv2
import tqdm

cap = cv2.VideoCapture("output.avi")

vw = None
nframes = 100
# for fast test, change the for loop to
# while True:
# to convert the whole video

for _ in tqdm.tqdm(range(nframes)):
    ret, frame = cap.read()
    if not ret:
        break
    if vw is None:
        vw = cv2.VideoWriter("output_safe.avi", cv2.VideoWriter_fourcc('M','J','P','G'), 10, (frame.shape[1], frame.shape[0]))
    vw.write(frame)


cap.release()
if vw is None:
    vw.release()

这些是与报告的原始视频的属性ffmpeg -i output.avi

Input #0, avi, from 'output.avi':
  Metadata:
    encoder         : Lavf58.64.100
  Duration: 00:01:00.00, start: 0.000000, bitrate: 1822 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 2592x1944 [SAR 1:1 DAR 4:3], 1817 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

这些是新属性

Input #0, avi, from 'output_safe.avi':
  Metadata:
    encoder         : Lavf58.61.100
  Duration: 00:00:10.00, start: 0.000000, bitrate: 7594 kb/s
    Stream #0:0: Video: mjpeg (Baseline) (MJPG / 0x47504A4D), yuvj420p(pc, bt470bg/unknown/unknown), 2592x1944, 7650 kb/s, 10 fps, 10 tbr, 10 tbn, 10 tbc

于 2021-05-29T18:12:42.580 回答