我一直在努力让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上工作吗?
答案 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++并没有解决问题:
写入~/.bashrc
alias matlab='LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22 /usr/local/bin/matlab -desktop'
关闭终端,再次打开,运行matlab,还是不行。
转到 /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