Matlab的VideoReader没有在Ubuntu 17.04上工作

时间:2018-01-18 15:48:58

标签: matlab gstreamer avi ubuntu-17.04

我一直在努力让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-with-ubtuntu-lts16-04

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

我不想重新安装Ubuntu 16.04,但要明白这是否是唯一的方法。但可以肯定的是,有人让MATLAB在Ubuntu 17上工作吗?

2 个答案:

答案 0 :(得分:3)

我的一位同事找到了解决我的问题的帖子的链接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'

经过测试后,我确认它有效。

答案 1 :(得分:0)

我遇到了完全相同的问题,我可以通过运行来解决

sudo apt install gstreamer1.0-plugins-*

在带有 MATLAB R2018a 的 Ubuntu 20.04 上

此外,以1.和2.的方式强制MATLAB使用系统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“不可见”并强制它在系统中查找它们的一种方式)也不起作用。< /p>

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

编辑

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

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