在发布模式下崩溃,在调试模式下遇到错误
Crashing in Release Mode and error encounter in Debug Mode
这是我关于堆栈溢出的第一个问题,所以请回答我。
我正在使用 libvlc 库 2.1.5win64 用于窗口 7 和 Qt 4.8.5、C++ 和 Cmake 2.8 来构建一个以 rtsp 协议从 VLC 服务器捕获流视频的项目。我非常严重地面临两个问题。
1:我的程序在发布模式下.exe文件膨胀,但是当我们打开(双击)此.exe文件时崩溃,而它在调试模式下正常工作。
2:我的程序在调试模式下也无法正常工作,当我打开.exe文件时,它显示一个小部件,但视频没有流式传输
它遇到错误
[0000000001c96b20] main input error: open of 'rtsp"//192.168.1.101:8554/' failed
[0000000001bcce90] main input error: your input can't be opened
[0000000001bcce90] main input error: VLC is unable to open the MRL 'rtsp://192.168.1.101:8554/'. check the log for details.
请有人回答我的问题...
我还在为我的源代码提供 cmakelist......
如果可能的话,请编辑我的代码,因为我是Qt,Cmake,LibVlc的新手
CmakeList.txt
cmake_minimum_required(VERSION 2.8)
PROJECT(VlcInterfaceWindow_FULL)
FIND_PACKAGE( Qt4 4.8.5 COMPONENTS QtMain QtCore QtGui REQUIRED )
#SET(VlcInterfaceWindow_SOURCES main.cpp vlc_on_qt.cpp)
SET(VlcInterfaceWindow_HEAERS vlc_on_qt.h)
INCLUDE(${QT_USE_FILE})
include_directories( "C:/vlc-2.1.5/sdk/include")
QT4_WRAP_CPP(VlcInterfaceWindow_HEAERS_MOC ${VlcInterfaceWindow_HEAERS})
add_library(lib_vlc STATIC IMPORTED)
set_property(TARGET lib_vlc PROPERTY IMPORTED_LOCATION_RELEASE C:/vlc-2.1.5/sdk/lib/libvlc.lib)
set_property(TARGET lib_vlc PROPERTY IMPORTED_LOCATION_DEBUG C:/vlc-2.1.5/sdk/lib/libvlc.lib)
add_library(lib_vlc_core STATIC IMPORTED)
set_property(TARGET lib_vlc_core PROPERTY IMPORTED_LOCATION_RELEASE C:/vlc-
2.1.5/sdk/lib/libvlccore.lib)
set_property(TARGET lib_vlc_core PROPERTY IMPORTED_DEBUG C:/vlc-2.1.5/sdk/lib/libvlccore.lib)
set(VlcTest_SRCS main.cpp vlc_on_qt.cpp )
ADD_EXECUTABLE(VlcInterfaceWindow_FULL ${VlcTest_SRCS} ${VlcInterfaceWindow_HEAERS_MOC})
TARGET_LINK_LIBRARIES(VlcInterfaceWindow_FULL ${QT_LIBRARIES} lib_vlc lib_vlc_core)
main.cpp
#include "vlc_on_qt.h"
#include <QtGui/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Player p;
p.resize(640,480);
//p.playFile("rtsp://38.117.88.90/TenTV/video");
p.playFile("rtsp://192.168.1.101:8554/");
p.show();
return a.exec();
}
vlc_on_qt.h
#ifndef VLC_ON_QT_H
#define VLC_ON_QT_H
#include <vlc/vlc.h>
#include <vlc/libvlc.h>
#include <QWidget>
class
QVBoxLayout;
class
QTimer;
class
QFrame;
class
QSlider;
#define POSITION_RESOLUTION 10000
class Player : public QWidget
{
Q_OBJECT
QSlider *_positionSlider;
QFrame *_videoWidget;
QTimer *poller;
bool _isPlaying;
libvlc_instance_t *_vlcinstance;
libvlc_media_player_t *_mp;
libvlc_media_t *_m;
public:
Player();
~播放器();
public slots:
void playFile(QString file);
void updateInterface();
void changePosition(int newPosition);
};
#endif
vlc_on_qt.cpp
#include "vlc_on_qt.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QSlider>
#include <QTimer>
#include <QFrame>
#include <iostream>
using namespace std;
Player::Player()
: QWidget()
{
_videoWidget=new QFrame(this);
_positionSlider=new QSlider(Qt::Horizontal,this);
_positionSlider->setMaximum(POSITION_RESOLUTION);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(_videoWidget);
layout->addWidget(_positionSlider);
setLayout(layout);
_isPlaying=false;
poller=new QTimer(this);
connect(poller, SIGNAL(timeout()),this, SLOT(updateInterface()));
connect(_positionSlider, SIGNAL(sliderMoved(int)), this, SLOT(changePosition(int)));
poller->start(100);
}
Player::~Player()
{
libvlc_media_player_stop (_mp);
libvlc_media_player_release (_mp);
libvlc_release (_vlcinstance);
}
void Player::playFile(QString file)
{
_vlcinstance=libvlc_new(0, NULL);
//Create a new LibVLC media descriptor
_m = libvlc_media_new_location(_vlcinstance, file.toAscii());
_mp=libvlc_media_player_new_from_media (_m);
// Get our media instance to use our window
libvlc_media_player_set_hwnd(_mp, _videoWidget->winId());
// Play
libvlc_media_player_play (_mp);
_isPlaying=true;
}
void Player::changePosition(int newPosition)
{
libvlc_media_t *curMedia = libvlc_media_player_get_media (_mp);
if (curMedia == NULL)
return;
float pos=(float)(newPosition)/(float)POSITION_RESOLUTION;
libvlc_media_player_set_position (_mp, pos);
}
void Player::updateInterface()
{
if(!_isPlaying)
return;
libvlc_media_t *curMedia = libvlc_media_player_get_media (_mp);
if (curMedia == NULL)
return;
float pos=libvlc_media_player_get_position (_mp);
int siderPos=(int)(pos*(float)(POSITION_RESOLUTION));
_positionSlider->setValue(siderPos);
}
来自VLC发行版的libvlc.lib总是被破坏用于发布的Visual Studio版本。要解决此问题,您有 3 个选项:
- 使用/OPT:NOREF 链接器选项进行发布构建;
- 使用 Visual Studio 的命令行工具(在 Videolan Wiki 的帮助下)从 libvlc 生成 libvlc.lib.dll; 使用来自我在 Google Code 上的 libvlc.lib
- 生成项目或 GitHub 上的 libvlc sdk 的预构建 libvlc.lib;
要找出视频解码的问题,您可以将"-vvv"(激活完整调试日志的选项)传递给libvlc_new
相关文章:
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 小字符串优化(调试与发布模式)
- 在调试模式下引发C++ "deque iterator not dereferencable"异常
- _mm256_load_ps调试模式下导致谷歌/基准测试的分段错误
- Visual Studio 发布模式阻止在调试模式下执行的代码.使用 WinHTTP 和多线程
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- 使用Qt Creator在调试模式下编译一段代码
- 在调试模式下,所有程序都运行良好,但在发布模式下,我在cudaMalloc操作中出错
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 在调试模式下编译时qrc_resource.cpp错误
- 如何在调试模式下通过终端运行可执行的 c++?
- 在Visual Studio 2017上无法使用调试模式x64进行OpenCV3.2编译
- 在调试模式下使用英特尔 TBB
- 我的代码在发布模式下不起作用,而在Qt的调试模式下工作
- SCANF 在 Eclipse 中不接受调试模式下的输入?
- 为什么我的 UWP 游戏在发布时比在调试模式下慢
- 在发布模式下崩溃,但如果可调试为 true - 不是..什么是可能的问题
- Visual Studio混合模式调试是否可以附加到Jupyter笔记本以同时调试C++和Python
- Windows 用户模式调试器传输 Visual Studio 2012
- VS2010 中使用 .NET 3.5 的混合模式调试