mirror of
https://github.com/wang-bin/QtAV.git
synced 2026-10-29 11:36:51 +08:00
Merge branch 'master' into dev
This commit is contained in:
@@ -5,8 +5,6 @@
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
#include <QtCore/QFileInfo>
|
||||
#include <QtCore/QSettings>
|
||||
#include <QtCore/QTextStream>
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QResizeEvent>
|
||||
#include <QWindowStateChangeEvent>
|
||||
@@ -23,6 +21,7 @@
|
||||
#include "ClickableMenu.h"
|
||||
#include "Slider.h"
|
||||
#include "StatisticsView.h"
|
||||
#include "TVView.h"
|
||||
|
||||
/*
|
||||
*TODO:
|
||||
@@ -89,6 +88,7 @@ void MainWindow::initPlayer()
|
||||
mpPlayer = new AVPlayer(this);
|
||||
mIsReady = true;
|
||||
qDebug("player created");
|
||||
mpCaptureBtn->setToolTip(tr("Capture video frame") + "\n" + tr("Save to") + ": " + mpPlayer->videoCapture()->captureDir());
|
||||
connect(mpStopBtn, SIGNAL(clicked()), mpPlayer, SLOT(stop()));
|
||||
connect(mpForwardBtn, SIGNAL(clicked()), mpPlayer, SLOT(seekForward()));
|
||||
connect(mpBackwardBtn, SIGNAL(clicked()), mpPlayer, SLOT(seekBackward()));
|
||||
@@ -112,7 +112,7 @@ void MainWindow::setupUi()
|
||||
|
||||
mpPlayerLayout = new QVBoxLayout();
|
||||
mpControl = new QWidget(this);
|
||||
mpControl->setMaximumHeight(22);
|
||||
mpControl->setMaximumHeight(25);
|
||||
|
||||
mpTimeSlider = new Slider(mpControl);
|
||||
mpTimeSlider->setDisabled(true);
|
||||
@@ -150,7 +150,7 @@ void MainWindow::setupUi()
|
||||
qDebug("%d x %d", mPlayPixmap.width(), mPlayPixmap.height());
|
||||
mpPlayPauseBtn = new Button(mpControl);
|
||||
int a = qMin(w/2, h);
|
||||
const int kMaxButtonIconWidth = 18;
|
||||
const int kMaxButtonIconWidth = 20;
|
||||
const int kMaxButtonIconMargin = kMaxButtonIconWidth/3;
|
||||
a = qMin(a, kMaxButtonIconWidth);
|
||||
mpPlayPauseBtn->setIconWithSates(mPlayPixmap);
|
||||
@@ -183,7 +183,6 @@ void MainWindow::setupUi()
|
||||
mpCaptureBtn->setIconWithSates(QPixmap(":/theme/screenshot.png"));
|
||||
mpCaptureBtn->setIconSize(QSize(a, a));
|
||||
mpCaptureBtn->setMaximumSize(a+kMaxButtonIconMargin+2, a+kMaxButtonIconMargin);
|
||||
mpCaptureBtn->setToolTip(tr("Capture video frame") + "\n" + tr("Save to") + ": capture");
|
||||
mpVolumeBtn = new Button();
|
||||
mpVolumeBtn->setIconWithSates(QPixmap(":/theme/button-max-volume.png"));
|
||||
mpVolumeBtn->setIconSize(QSize(a, a));
|
||||
@@ -211,33 +210,7 @@ void MainWindow::setupUi()
|
||||
*/
|
||||
mpMenu = new QMenu(mpMenuBtn);
|
||||
mpMenu->addAction(tr("Open Url"), this, SLOT(openUrl()));
|
||||
QMenu *subMenu = new QMenu(tr("Online channels"));
|
||||
connect(subMenu, SIGNAL(triggered(QAction*)), SLOT(playOnlineVideo(QAction*)));
|
||||
QFile tv_file(qApp->applicationDirPath() + "/tv.ini");
|
||||
if (!tv_file.exists())
|
||||
tv_file.setFileName(":/tv.ini");
|
||||
if (tv_file.open(QIODevice::ReadOnly)) {
|
||||
QTextStream ts(&tv_file);
|
||||
ts.setCodec("UTF-8");
|
||||
QString line;
|
||||
while (!ts.atEnd()) {
|
||||
line = ts.readLine();
|
||||
if (line.isEmpty() || line.startsWith("#") || !line.contains("="))
|
||||
continue;
|
||||
QString key = line.section('=', 0, 0);
|
||||
QString value = line.section('=', 1);
|
||||
subMenu->addAction(key)->setData(value);
|
||||
}
|
||||
}
|
||||
/*
|
||||
//codec problem
|
||||
QSettings tv(qApp->applicationDirPath() + "/tv.ini", QSettings::IniFormat);
|
||||
tv.setIniCodec("UTF-8");
|
||||
foreach (QString key, tv.allKeys()) {
|
||||
subMenu->addAction(key)->setData(tv.value(key).toString());
|
||||
}
|
||||
*/
|
||||
mpMenu->addMenu(subMenu);
|
||||
mpMenu->addAction(tr("Online channels"), this, SLOT(onTVMenuClick()));
|
||||
mpMenu->addSeparator();
|
||||
mpMenu->addAction(tr("Setup"), this, SLOT(setup()))->setEnabled(false);
|
||||
mpMenu->addAction(tr("Report"))->setEnabled(false); //report bug, suggestions etc. using maillist?
|
||||
@@ -248,7 +221,7 @@ void MainWindow::setupUi()
|
||||
mpMenuBtn->setMenu(mpMenu);
|
||||
mpMenu->addSeparator();
|
||||
|
||||
subMenu = new QMenu(tr("Speed"));
|
||||
QMenu *subMenu = new QMenu(tr("Speed"));
|
||||
mpMenu->addMenu(subMenu);
|
||||
QDoubleSpinBox *pSpeedBox = new QDoubleSpinBox(0);
|
||||
pSpeedBox->setRange(0.01, 20);
|
||||
@@ -800,6 +773,21 @@ void MainWindow::playOnlineVideo(QAction *action)
|
||||
play(action->data().toString());
|
||||
}
|
||||
|
||||
void MainWindow::onTVMenuClick()
|
||||
{
|
||||
static TVView *tvv = new TVView;
|
||||
tvv->show();
|
||||
connect(tvv, SIGNAL(clicked(QString,QString)), SLOT(onPlayListClick(QString,QString)));
|
||||
tvv->setMaximumHeight(qApp->desktop()->height());
|
||||
tvv->setMinimumHeight(tvv->width()*2);
|
||||
}
|
||||
|
||||
void MainWindow::onPlayListClick(const QString &key, const QString &value)
|
||||
{
|
||||
mTitle = key;
|
||||
play(value);
|
||||
}
|
||||
|
||||
void MainWindow::tryHideControlBar()
|
||||
{
|
||||
if (mShowControl > 0) {
|
||||
@@ -846,8 +834,9 @@ bool MainWindow::winEvent(MSG *message, long *result)
|
||||
|
||||
void MainWindow::showInfo()
|
||||
{
|
||||
static StatisticsView sv;
|
||||
// why crash if on stack
|
||||
static StatisticsView *sv = new StatisticsView;
|
||||
if (mpPlayer)
|
||||
sv.setStatistics(mpPlayer->statistics());
|
||||
sv.show();
|
||||
sv->setStatistics(mpPlayer->statistics());
|
||||
sv->show();
|
||||
}
|
||||
|
||||
@@ -47,7 +47,9 @@ private slots:
|
||||
void changeVO(QAction* action);
|
||||
void changeChannel(QAction* action);
|
||||
void changeAudioTrack(QAction* action);
|
||||
void playOnlineVideo(QAction* action);
|
||||
void onTVMenuClick();
|
||||
void playOnlineVideo(QAction *action);
|
||||
void onPlayListClick(const QString& key, const QString& value);
|
||||
void processPendingActions();
|
||||
void initPlayer();
|
||||
void setupUi();
|
||||
|
||||
@@ -103,8 +103,8 @@ StatisticsView::StatisticsView(QWidget *parent) :
|
||||
mpView->setColumnCount(2);
|
||||
initBaseItems(&mBaseItems);
|
||||
mpView->addTopLevelItems(mBaseItems);
|
||||
mpView->addTopLevelItem(initVideoItems(&mVideoItems));
|
||||
mpView->addTopLevelItem(initAudioItems(&mAudioItems));
|
||||
mpView->addTopLevelItem(createNodeWithItems(mpView, QObject::tr("Video"), getVideoInfoKeys(), &mVideoItems));
|
||||
mpView->addTopLevelItem(createNodeWithItems(mpView, QObject::tr("Audio"), getAudioInfoKeys(), &mAudioItems));
|
||||
mpView->resizeColumnToContents(0); //call this after content is done
|
||||
|
||||
QPushButton *btn = new QPushButton(QObject::tr("Ok"));
|
||||
@@ -157,32 +157,18 @@ void StatisticsView::initBaseItems(QList<QTreeWidgetItem *> *items)
|
||||
}
|
||||
}
|
||||
|
||||
QTreeWidgetItem* StatisticsView::initVideoItems(QList<QTreeWidgetItem *> *items)
|
||||
QTreeWidgetItem* StatisticsView::createNodeWithItems(QTreeWidget *view, const QString &name, const QStringList &itemNames, QList<QTreeWidgetItem *> *items)
|
||||
{
|
||||
QTreeWidgetItem *videoItem = new QTreeWidgetItem(mpView);
|
||||
videoItem->setData(0, Qt::DisplayRole, QObject::tr("Video"));
|
||||
QTreeWidgetItem *nodeItem = new QTreeWidgetItem(view);
|
||||
nodeItem->setData(0, Qt::DisplayRole, name);
|
||||
QTreeWidgetItem *item = 0;
|
||||
foreach(QString key, getVideoInfoKeys()) {
|
||||
item = new QTreeWidgetItem(videoItem);
|
||||
foreach(QString key, itemNames) {
|
||||
item = new QTreeWidgetItem(nodeItem);
|
||||
item->setData(0, Qt::DisplayRole, key);
|
||||
items->append(item);
|
||||
nodeItem->addChild(item);
|
||||
if (items)
|
||||
items->append(item);
|
||||
}
|
||||
videoItem->addChildren(*items);
|
||||
videoItem->setExpanded(true);
|
||||
return videoItem;
|
||||
}
|
||||
|
||||
QTreeWidgetItem* StatisticsView::initAudioItems(QList<QTreeWidgetItem *> *items)
|
||||
{
|
||||
QTreeWidgetItem *audioItem = new QTreeWidgetItem(mpView);
|
||||
audioItem->setData(0, Qt::DisplayRole, QObject::tr("Audio"));
|
||||
QTreeWidgetItem *item = 0;
|
||||
foreach(QString key, getAudioInfoKeys()) {
|
||||
item = new QTreeWidgetItem(audioItem);
|
||||
item->setData(0, Qt::DisplayRole, key);
|
||||
items->append(item);
|
||||
}
|
||||
audioItem->addChildren(*items);
|
||||
audioItem->setExpanded(true);
|
||||
return audioItem;
|
||||
nodeItem->setExpanded(true);
|
||||
return nodeItem;
|
||||
}
|
||||
|
||||
@@ -21,8 +21,7 @@ public slots:
|
||||
|
||||
private:
|
||||
void initBaseItems(QList<QTreeWidgetItem*>* items);
|
||||
QTreeWidgetItem* initVideoItems(QList<QTreeWidgetItem*>* items);
|
||||
QTreeWidgetItem* initAudioItems(QList<QTreeWidgetItem*>* items);
|
||||
QTreeWidgetItem* createNodeWithItems(QTreeWidget* view, const QString& name, const QStringList& itemNames, QList<QTreeWidgetItem*>* items = 0);
|
||||
|
||||
QTreeWidget *mpView;
|
||||
QList<QTreeWidgetItem*> mBaseItems;
|
||||
@@ -30,7 +29,6 @@ private:
|
||||
//TODO: multiple streams
|
||||
QList<QTreeWidgetItem*> mAudioItems;
|
||||
Statistics mStatistics;
|
||||
|
||||
};
|
||||
|
||||
#endif // STATISTICSVIEW_H
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
#include "TVView.h"
|
||||
#include <QtCore/QTimer>
|
||||
#include <QtCore/QFile>
|
||||
#include <QLayout>
|
||||
#include <QTreeWidget>
|
||||
#include <QTreeWidgetItem>
|
||||
#include <QString>
|
||||
#include <QApplication>
|
||||
#include <QtCore/QTextStream>
|
||||
|
||||
TVView::TVView(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
{
|
||||
setWindowTitle(tr("Online TV channels"));
|
||||
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
|
||||
mpView = new QTreeWidget();
|
||||
mpView->setHeaderHidden(true);
|
||||
mpView->setColumnCount(1);
|
||||
connect(mpView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), SLOT(onItemDoubleClick (QTreeWidgetItem*,int)));
|
||||
QVBoxLayout *vl = new QVBoxLayout();
|
||||
vl->addWidget(mpView);
|
||||
setLayout(vl);
|
||||
QTimer::singleShot(0, this, SLOT(load()));
|
||||
}
|
||||
|
||||
void TVView::load()
|
||||
{
|
||||
/*
|
||||
//codec problem
|
||||
QSettings tv(qApp->applicationDirPath() + "/tv.ini", QSettings::IniFormat);
|
||||
tv.setIniCodec("UTF-8");
|
||||
foreach (QString key, tv.allKeys()) {
|
||||
subMenu->addAction(key)->setData(tv.value(key).toString());
|
||||
}
|
||||
*/
|
||||
QFile tv_file(qApp->applicationDirPath() + "/tv.ini");
|
||||
if (!tv_file.exists())
|
||||
tv_file.setFileName(":/tv.ini");
|
||||
if (!tv_file.open(QIODevice::ReadOnly))
|
||||
return;
|
||||
QTextStream ts(&tv_file);
|
||||
ts.setCodec("UTF-8");
|
||||
QTreeWidgetItem *nodeItem = new QTreeWidgetItem(mpView);
|
||||
nodeItem->setData(0, Qt::DisplayRole, "");
|
||||
mpView->addTopLevelItem(nodeItem);
|
||||
nodeItem->setExpanded(true);
|
||||
QString line;
|
||||
while (!ts.atEnd()) {
|
||||
line = ts.readLine();
|
||||
if (line.isEmpty() || line.startsWith("#"))
|
||||
continue;
|
||||
if (!line.contains("=")) {
|
||||
nodeItem = new QTreeWidgetItem(mpView);
|
||||
nodeItem->setData(0, Qt::DisplayRole, line);
|
||||
mpView->addTopLevelItem(nodeItem);
|
||||
continue;
|
||||
}
|
||||
QString key = line.section('=', 0, 0);
|
||||
QString value = line.section('=', 1);
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem(nodeItem);
|
||||
item->setData(0, Qt::DisplayRole, key);
|
||||
item->setData(1, Qt::EditRole, value);
|
||||
}
|
||||
mpView->resizeColumnToContents(0); //call this after content is done
|
||||
}
|
||||
|
||||
void TVView::onItemDoubleClick(QTreeWidgetItem *item, int column)
|
||||
{
|
||||
emit clicked(item->data(0, Qt::DisplayRole).toString(), item->data(1, Qt::EditRole).toString());
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef TVVIEW_H
|
||||
#define TVVIEW_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
|
||||
class QTreeWidget;
|
||||
class QTreeWidgetItem;
|
||||
|
||||
class TVView : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TVView(QWidget *parent = 0);
|
||||
|
||||
signals:
|
||||
void clicked(const QString& key, const QString& value);
|
||||
|
||||
private slots:
|
||||
void load();
|
||||
void onItemDoubleClick( QTreeWidgetItem * item, int column);
|
||||
private:
|
||||
QTreeWidgetItem* createNodeWithItems(QTreeWidget* view, const QString& name, const QStringList& itemNames, QList<QTreeWidgetItem*>* items = 0);
|
||||
|
||||
QTreeWidget *mpView;
|
||||
|
||||
};
|
||||
|
||||
#endif // TVVIEW_H
|
||||
@@ -16,7 +16,8 @@ SOURCES += main.cpp \
|
||||
ClickableMenu.cpp \
|
||||
ScreenSaver.cpp \
|
||||
StatisticsView.cpp \
|
||||
Slider.cpp
|
||||
Slider.cpp \
|
||||
TVView.cpp
|
||||
|
||||
HEADERS += \
|
||||
MainWindow.h \
|
||||
@@ -24,7 +25,8 @@ HEADERS += \
|
||||
ClickableMenu.h \
|
||||
ScreenSaver.h \
|
||||
StatisticsView.h \
|
||||
Slider.h
|
||||
Slider.h \
|
||||
TVView.h
|
||||
|
||||
tv.files = res/tv.ini
|
||||
BIN_INSTALLS += tv
|
||||
|
||||
Binary file not shown.
@@ -4,183 +4,190 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="73"/>
|
||||
<location filename="../MainWindow.cpp" line="74"/>
|
||||
<source>Click black area to use shortcut(see right click menu)</source>
|
||||
<translation>点击黑色区域以使用快捷键(见右键菜单)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="129"/>
|
||||
<location filename="../MainWindow.cpp" line="130"/>
|
||||
<source>Current time</source>
|
||||
<translation>播放时间</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="133"/>
|
||||
<location filename="../MainWindow.cpp" line="134"/>
|
||||
<source>Duration</source>
|
||||
<translation>视频时长</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="137"/>
|
||||
<location filename="../MainWindow.cpp" line="138"/>
|
||||
<source>Render engine</source>
|
||||
<translation>渲染引擎</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="142"/>
|
||||
<location filename="../MainWindow.cpp" line="143"/>
|
||||
<source>Speed. Ctrl+Up/Down</source>
|
||||
<translation>速度. Ctrl+上/下</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="170"/>
|
||||
<location filename="../MainWindow.cpp" line="171"/>
|
||||
<source>Open</source>
|
||||
<translation>打开</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="184"/>
|
||||
<location filename="../MainWindow.cpp" line="185"/>
|
||||
<source>Capture video frame</source>
|
||||
<translation>视频截图</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="184"/>
|
||||
<location filename="../MainWindow.cpp" line="185"/>
|
||||
<source>Save to</source>
|
||||
<translation>保存至</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="211"/>
|
||||
<location filename="../MainWindow.cpp" line="212"/>
|
||||
<source>Open Url</source>
|
||||
<translation>打开 Url</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="212"/>
|
||||
<location filename="../MainWindow.cpp" line="213"/>
|
||||
<source>Online channels</source>
|
||||
<translation>在线频道</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="240"/>
|
||||
<location filename="../MainWindow.cpp" line="215"/>
|
||||
<source>Setup</source>
|
||||
<translation>设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="241"/>
|
||||
<location filename="../MainWindow.cpp" line="216"/>
|
||||
<source>Report</source>
|
||||
<translation>反馈</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="242"/>
|
||||
<location filename="../MainWindow.cpp" line="217"/>
|
||||
<source>About</source>
|
||||
<translation>关于</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="243"/>
|
||||
<location filename="../MainWindow.cpp" line="218"/>
|
||||
<source>Help</source>
|
||||
<translation>帮助</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="245"/>
|
||||
<location filename="../MainWindow.cpp" line="220"/>
|
||||
<source>About Qt</source>
|
||||
<translation>关于 Qt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="249"/>
|
||||
<location filename="../MainWindow.cpp" line="224"/>
|
||||
<source>Speed</source>
|
||||
<translation>速度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="260"/>
|
||||
<location filename="../MainWindow.cpp" line="235"/>
|
||||
<source>Repeat</source>
|
||||
<translation>重复</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="264"/>
|
||||
<location filename="../MainWindow.cpp" line="239"/>
|
||||
<source>Enable</source>
|
||||
<translation>启用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="243"/>
|
||||
<source>infinity</source>
|
||||
<translation>无限</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No</source>
|
||||
<translation>否</translation>
|
||||
<translation type="obsolete">否</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="266"/>
|
||||
<source>Single</source>
|
||||
<translation>单个</translation>
|
||||
<translation type="obsolete">单个</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="267"/>
|
||||
<source>All</source>
|
||||
<translation>所有</translation>
|
||||
<translation type="obsolete">所有</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="273"/>
|
||||
<location filename="../MainWindow.cpp" line="761"/>
|
||||
<location filename="../MainWindow.cpp" line="251"/>
|
||||
<location filename="../MainWindow.cpp" line="745"/>
|
||||
<source>Aspect ratio</source>
|
||||
<translation>比例</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="276"/>
|
||||
<location filename="../MainWindow.cpp" line="254"/>
|
||||
<source>Video</source>
|
||||
<translation>视频</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="278"/>
|
||||
<location filename="../MainWindow.cpp" line="256"/>
|
||||
<source>Window</source>
|
||||
<translation>窗口</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="281"/>
|
||||
<location filename="../MainWindow.cpp" line="259"/>
|
||||
<source>Custom</source>
|
||||
<translation>自定义</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="287"/>
|
||||
<location filename="../MainWindow.cpp" line="265"/>
|
||||
<source>Audio track</source>
|
||||
<translation>音轨</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="291"/>
|
||||
<location filename="../MainWindow.cpp" line="269"/>
|
||||
<source>Channel</source>
|
||||
<translation>声道</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="294"/>
|
||||
<location filename="../MainWindow.cpp" line="272"/>
|
||||
<source>As input</source>
|
||||
<translation>同输入</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="296"/>
|
||||
<location filename="../MainWindow.cpp" line="274"/>
|
||||
<source>Stero</source>
|
||||
<translation>立体声</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="297"/>
|
||||
<location filename="../MainWindow.cpp" line="275"/>
|
||||
<source>Mono (center)</source>
|
||||
<translation>单声道 (中央)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="298"/>
|
||||
<location filename="../MainWindow.cpp" line="276"/>
|
||||
<source>Left</source>
|
||||
<translation>左声道</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="299"/>
|
||||
<location filename="../MainWindow.cpp" line="277"/>
|
||||
<source>Right</source>
|
||||
<translation>右声道</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="305"/>
|
||||
<location filename="../MainWindow.cpp" line="283"/>
|
||||
<source>Renderer</source>
|
||||
<translation>渲染引擎</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="424"/>
|
||||
<location filename="../MainWindow.cpp" line="402"/>
|
||||
<source>not availabe on your platform!</source>
|
||||
<translation>你的平台上不可使用!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="530"/>
|
||||
<location filename="../MainWindow.cpp" line="508"/>
|
||||
<source>Open a media file</source>
|
||||
<translation>打开媒体文件</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="709"/>
|
||||
<location filename="../MainWindow.cpp" line="690"/>
|
||||
<source>Open an url</source>
|
||||
<translation>打开 url</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="709"/>
|
||||
<location filename="../MainWindow.cpp" line="690"/>
|
||||
<source>Url</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
@@ -295,12 +302,12 @@
|
||||
<translation>确定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../StatisticsView.cpp" line="163"/>
|
||||
<location filename="../StatisticsView.cpp" line="106"/>
|
||||
<source>Video</source>
|
||||
<translation>视频</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../StatisticsView.cpp" line="178"/>
|
||||
<location filename="../StatisticsView.cpp" line="107"/>
|
||||
<source>Audio</source>
|
||||
<translation>音频</translation>
|
||||
</message>
|
||||
@@ -313,4 +320,12 @@
|
||||
<translation>媒体信息</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TVView</name>
|
||||
<message>
|
||||
<location filename="../TVView.cpp" line="14"/>
|
||||
<source>Online TV channels</source>
|
||||
<translation>在线电视</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
||||
+71
-42
@@ -1,6 +1,7 @@
|
||||
#http://mraandtux.github.io/tv/
|
||||
#m3u8: http://blog.csdn.net/perfect_promise/article/details/9713663
|
||||
#CUTV: http://5mu5.com/forum.php?mod=viewthread&tid=6565
|
||||
CCTV
|
||||
CCTV-1 HD=rtsp://l.m.cztv.com:554/hdmi/cctv1hd.stream
|
||||
CCTV-1=http://live.gslb.letv.com/gslb?stream_id=cctv1&tag=live&ext=m3u8
|
||||
CCTV-2=http://live.gslb.letv.com/gslb?stream_id=cctv2&tag=live&ext=m3u8
|
||||
@@ -20,7 +21,13 @@ CCTV-Music=http://live.gslb.letv.com/gslb?stream_id=cctvmusic&tag=live&ext=m3u8&
|
||||
CCTV-风云足球=http://live.gslb.letv.com/gslb?stream_id=fyzq&tag=live&ext=m3u8&sign=live_ipad
|
||||
CCTV-风云音乐=http://live.gslb.letv.com/gslb?stream_id=fyyy&tag=live&ext=m3u8&sign=live_ipad
|
||||
怀旧剧场=http://live.gslb.letv.com/gslb?stream_id=hjjc&tag=live&ext=m3u8&sign=live_ipad
|
||||
#CCTV1=rtsp://122.192.35.80:554/live/tv14
|
||||
#CCTV3=rtsp://122.192.35.80:554/live/tv30
|
||||
#CCTV4=rtsp://122.192.35.80:554/live/tv07
|
||||
#CCTV6=rtsp://122.192.35.80:554/live/tv31
|
||||
|
||||
|
||||
卫视
|
||||
#北京卫视=http://live.gslb.letv.com/gslb?stream_id=bjws&tag=live&ext=m3u8&sign=live_ipad
|
||||
山东卫视=http://live.gslb.letv.com/gslb?stream_id=shandong&tag=live&ext=m3u8&sign=live_ipad
|
||||
东南卫视=http://live.gslb.letv.com/gslb?stream_id=dongnan&tag=live&ext=m3u8&sign=live_ipad
|
||||
@@ -30,7 +37,9 @@ CCTV-风云音乐=http://live.gslb.letv.com/gslb?stream_id=fyyy&tag=live&ext=m3u
|
||||
江西卫视=http://live.gslb.letv.com/gslb?stream_id=jiangxi&tag=live&ext=m3u8&sign=live_ipad
|
||||
湖北卫视=http://live.gslb.letv.com/gslb?stream_id=hubei&tag=live&ext=m3u8&sign=live_ipad
|
||||
#广西卫视=http://live.gslb.letv.com/gslb?stream_id=guangxi&tag=live&ext=m3u8&sign=live_ipad
|
||||
广西卫视=http://qqlive.dnion.com:1863/974433428.flv
|
||||
甘肃卫视=http://live.gslb.letv.com/gslb?stream_id=gansu&tag=live&ext=m3u8&sign=live_ipad
|
||||
云南卫视=http://qqlive.dnion.com:1863/708402866.flv
|
||||
云南卫视=http://live.gslb.letv.com/gslb?stream_id=yunnan&tag=live&ext=m3u8&sign=live_ipad
|
||||
#辽宁卫视=http://live.gslb.letv.com/gslb?stream_id=liaoning&tag=live&ext=m3u8&sign=live_ipad
|
||||
贵州卫视=http://live.gslb.letv.com/gslb?stream_id=guizhou&tag=live&ext=m3u8&sign=live_ipad
|
||||
@@ -41,22 +50,28 @@ CCTV-风云音乐=http://live.gslb.letv.com/gslb?stream_id=fyyy&tag=live&ext=m3u
|
||||
深圳卫视=http://live.gslb.letv.com/gslb?stream_id=shenzhen&tag=live&ext=m3u8&sign=live_ipad
|
||||
南方卫视=http://live.gslb.letv.com/gslb?stream_id=nanfang&tag=live&ext=m3u8&sign=live_ipad
|
||||
#内蒙古卫视=http://live.gslb.letv.com/gslb?stream_id=neimenggu&tag=live&ext=m3u8&sign=live_ipad
|
||||
内蒙古卫视=http://qqlive.dnion.com:1863/2342060367.flv
|
||||
黑龙江卫视=http://live.gslb.letv.com/gslb?stream_id=heilongjiang&tag=live&ext=m3u8&sign=live_ipad
|
||||
|
||||
Other
|
||||
金鹰卡通=http://live.gslb.letv.com/gslb?stream_id=jykt&tag=live&ext=m3u8&sign=live_ipad
|
||||
炫动卡通=http://live.gslb.letv.com/gslb?stream_id=xdkt&tag=live&ext=m3u8&sign=live_ipad
|
||||
卡酷动画=http://live.gslb.letv.com/gslb?stream_id=bjkaku&tag=live&ext=m3u8&sign=live_ipad
|
||||
山东教育=http://live.gslb.letv.com/gslb?stream_id=sdjy&tag=live&ext=m3u8&sign=live_ipad
|
||||
广东体育=http://live.gslb.letv.com/gslb?stream_id=guangdongtiyu&tag=live&ext=m3u8&sign=live_ipad
|
||||
天元围棋=http://live.gslb.letv.com/gslb?stream_id=tywq&tag=live&ext=m3u8&sign=live_ipad
|
||||
北京体育=http://live.gslb.letv.com/gslb?stream_id=btv6_800&tag=live&ext=m3u8
|
||||
乐视体育=http://live.gslb.letv.com/gslb?stream_id=sportlive&tag=live&ext=m3u8
|
||||
乐视盛典=http://live.gslb.letv.com/gslb?stream_id=shengdian&tag=live&ext=m3u8
|
||||
|
||||
KBS=http://news24kbs-2.gscdn.com/news24_300/_definst_/news24_300.stream/playlist.m3u8
|
||||
|
||||
澳亚卫视=http://tsl4.hls.cutv.com/cutvlive/AJ9m0cd/hls/live_sd.m3u8
|
||||
|
||||
台湾-好消息1=http://210.59.248.53/hls-live/livepkgr/_definst_/liveevent/live-ch1-3.m3u8
|
||||
台湾-好消息2=http://210.59.248.53/hls-live/livepkgr/_definst_/liveevent/live-ch2-3.m3u8
|
||||
|
||||
旅游卫视=rtsp://122.192.35.80:554/live/tv08
|
||||
#NJTV新闻综合=rtsp://122.192.35.80:554/live/tv08
|
||||
MursTv=rtsp://122.192.35.80:554/live/tv20
|
||||
NBS新闻综合=rtsp://122.192.35.80:554/live/tv09
|
||||
靓妆=rtsp://122.192.35.80:554/live/tv50
|
||||
|
||||
KBS=http://news24kbs-2.gscdn.com/news24_300/_definst_/news24_300.stream/playlist.m3u8
|
||||
Korea Lady TV=http://ladytv.tv/channels/1111/800.flv/live
|
||||
Korea Movies=http://ladytv.tv/channels/39/800.flv/live
|
||||
|
||||
@@ -97,6 +112,7 @@ Disney=http://94.242.221.141/hls/a-lo/stream127.m3u8
|
||||
Diva Universal=http://94.242.221.141/hls/a-lo/stream137.m3u8
|
||||
141 (Arab)=http://94.242.221.141/hls/a-lo/stream141.m3u8
|
||||
|
||||
浙江
|
||||
#浙江卫视 HD=rtsp://l.m.cztv.com:554/hdmi/zjtv1hd.stream
|
||||
浙江卫视=http://zb.v.qq.com:1863/?progid=1975434150
|
||||
浙江钱江=http://v2.cztv.com/channels/102/500.flv/live
|
||||
@@ -109,17 +125,22 @@ Diva Universal=http://94.242.221.141/hls/a-lo/stream137.m3u8
|
||||
浙江国际=http://v11.cztv.com/channels/110/500.flv/live
|
||||
浙江网络=http://c7.cztv.com/channels/304/512.flv/live
|
||||
留学世界=http://v9.cztv.com/channels/109/500.flv/live
|
||||
|
||||
绍兴影视娱乐=http://tsl4.hls.cutv.com/cutvlive/24yG85b/hls/live_sd.m3u8
|
||||
绍兴公共=http://tsl4.hls.cutv.com/cutvlive/kSpsAae/hls/live_sd.m3u8
|
||||
绍兴新闻综合=http://tsl4.hls.cutv.com/cutvliv
|
||||
|
||||
宁波
|
||||
宁波新闻综合=http://ming-live.nbtv.cn/channels/nbtv/nbtv1/flv:sd1/live
|
||||
宁波社会生活=http://ming-live.nbtv.cn/channels/nbtv/nbtv2/flv:sd/live
|
||||
宁波文化娱乐=http://ming-live.nbtv.cn/channels/nbtv/nbtv3/flv:sd/live
|
||||
宁波电视剧=http://ming-live.nbtv.cn/channels/nbtv/nbtv4/flv:sd/live
|
||||
宁波少儿=http://ming-live.nbtv.cn/channels/nbtv/nbtv5/flv:sd/live
|
||||
|
||||
绍兴影视娱乐=http://tsl4.hls.cutv.com/cutvlive/24yG85b/hls/live_sd.m3u8
|
||||
绍兴公共=http://tsl4.hls.cutv.com/cutvlive/kSpsAae/hls/live_sd.m3u8
|
||||
绍兴新闻综合=http://tsl4.hls.cutv.com/cutvlive/4IzgShp/hls/live_sd.m3u8
|
||||
上海
|
||||
东方卫视 HD=rtsp://l.m.cztv.com:554/hdmi/dftv1hd.stream
|
||||
东方卫视=http://qqlive.dnion.com:1863/3900155972.flv
|
||||
#东方卫视=rtsp://122.192.35.80:554/live/tv11
|
||||
#东方卫视qq=http://zb.v.qq.com:1863/?progid=3900155972
|
||||
上海新闻综合=http://live-cdn1.smgbb.tv/channels/bbtv/xwzh/flv:sd/live
|
||||
上海星尚=http://live-cdn1.smgbb.tv/channels/bbtv/shss/flv:sd/live
|
||||
@@ -136,8 +157,11 @@ Diva Universal=http://94.242.221.141/hls/a-lo/stream137.m3u8
|
||||
看看新闻网=http://live-cdn1.smgbb.tv/channels/bbtv/kkxww/flv:sd/live
|
||||
魅力音乐=http://tvie01.ucatv.com.cn/channels/xjyx/MeiLiYinYue-Suma/flv:500k_flv
|
||||
|
||||
河北
|
||||
北京卫视 HD=rtsp://l.m.cztv.com:554/hdmi/bjtv1hd.stream
|
||||
北京卫视=http://qqlive.dnion.com:1863/1039787969.flv
|
||||
北京体育=http://live.gslb.letv.com/gslb?stream_id=btv6_800&tag=live&ext=m3u8
|
||||
档案(北京)=rtsp://122.192.35.80:554/live/tv12
|
||||
河北经济=http://live01.hebtv.com/channels/hebtv/video_channel_02/flv:800k/live
|
||||
河北都市=http://live01.hebtv.com/channels/hebtv/video_channel_01/flv:800k/live
|
||||
河北影视=http://live01.hebtv.com/channels/hebtv/video_channel_06/flv:800k/live
|
||||
@@ -149,6 +173,11 @@ Diva Universal=http://94.242.221.141/hls/a-lo/stream137.m3u8
|
||||
石家庄生活=http://live.sjzntv.cn/channels/sjzntv/video_channel_03/flv:800k/live
|
||||
石家庄都市=http://live.sjzntv.cn/channels/sjzntv/video_channel_04/flv:800k/live
|
||||
|
||||
山东
|
||||
山东教育=http://live.gslb.letv.com/gslb?stream_id=sdjy&tag=live&ext=m3u8&sign=live_ipad
|
||||
烟台新闻综合=http://tsl2.hls.cutv.com/cutvlive/rL8910q/hls/live_sd.m3u8
|
||||
|
||||
黑龙江
|
||||
黑龙江卫视 HD=rtsp://l.m.cztv.com:554/hdmi/hljtv1hd.stream
|
||||
黑龙江影视=http://live2.hljtv.com/channels/hljtv/yspd/flv:hd/live
|
||||
黑龙江文艺=http://live2.hljtv.com/channels/hljtv/wypd/flv:hd/live
|
||||
@@ -159,11 +188,16 @@ Diva Universal=http://94.242.221.141/hls/a-lo/stream137.m3u8
|
||||
黑龙江导视=http://live2.hljtv.com/channels/hljtv/daoshi/flv:hd/live
|
||||
黑龙江考试=http://live2.hljtv.com/channels/hljtv/kspd/flv:hd/live
|
||||
|
||||
新疆
|
||||
新疆教育=http://tvie01.ucatv.com.cn/channels/xjyx/XETV-Envivio/flv:500k_rtmp
|
||||
乌鲁木齐新闻(汉语)=http://tvie01.ucatv.com.cn/channels/xjyx/UTV1-Envivio/flv:500k_rtmp
|
||||
内蒙古卫视=http://qqlive.dnion.com:1863/2342060367.flv
|
||||
广西卫视=http://qqlive.dnion.com:1863/974433428.flv
|
||||
雪梨TV=http://live.sjzntv.cn/channels/sjzntv/vChannel1/flv:vChannel1/live
|
||||
|
||||
湖南
|
||||
湖南卫视=rtsp://122.192.35.80:554/live/tv10
|
||||
湖南卫视 HD=rtsp://l.m.cztv.com:554/hdmi/hntv1hd.stream
|
||||
|
||||
湖北
|
||||
湖北综合=http://live9.hbtv.com.cn/channels/zbk/hbtv/flv:sd/live
|
||||
湖北经济=http://live9.hbtv.com.cn/channels/zbk/jingshi2/flv:sd/live
|
||||
湖北公共=http://live9.hbtv.com.cn/channels/zbk/hbgg/flv:sd/live
|
||||
@@ -173,6 +207,7 @@ Diva Universal=http://94.242.221.141/hls/a-lo/stream137.m3u8
|
||||
湖北教育=http://live9.hbtv.com.cn/channels/zbk/hbjy/flv:sd/live
|
||||
孕育指南=http://live9.hbtv.com.cn/channels/zbk/yyzl/flv:sd/live
|
||||
|
||||
河南
|
||||
河南都市=http://live.hntv.tv/channels/tvie/video_channel_02/flv:hntv2_apple_200k/live
|
||||
河南民生=http://live.hntv.tv/channels/tvie/video_channel_03/flv:hntv3_apple_200k/live
|
||||
河南法制=http://live.hntv.tv/channels/tvie/video_channel_04/flv:hntv4_apple_200k/live
|
||||
@@ -181,29 +216,32 @@ Diva Universal=http://94.242.221.141/hls/a-lo/stream137.m3u8
|
||||
河南商务=http://live.hntv.tv/channels/tvie/video_channel_07/flv:hntv7_apple_200k/live
|
||||
河南公共=http://live.hntv.tv/channels/tvie/video_channel_08/flv:hntv8_apple_200k/live
|
||||
|
||||
四川
|
||||
四川卫视=http://qqlive.dnion.com:1863/2453801339.flv
|
||||
雅安新闻综合=http://yatv.tv/tvstm/tv/live/yaan01/yaan01-300.m3u8
|
||||
|
||||
云南卫视=http://qqlive.dnion.com:1863/708402866.flv
|
||||
|
||||
辽宁
|
||||
辽宁卫视=http://qqlive.dnion.com:1863/3006271240.flv
|
||||
辽宁经济=http://streamer.csytv.com/live/2?fmt=H264_800K_FLV
|
||||
辽宁公共=http://streamer.csytv.com/live/3?fmt=H264_800K_FLV
|
||||
沈阳新闻=http://streamer.csytv.com/live/1?fmt=H264_800K_FLV
|
||||
大连新闻综合=http://tsl2.hls.cutv.com/cutvlive/Wrezdc5/hls/live_sd.m3u8
|
||||
#辽宁卫视=rtsp://122.192.35.80:554/live/tv16
|
||||
|
||||
|
||||
湖南卫视=rtsp://122.192.35.80:554/live/tv10
|
||||
湖南卫视 HD=rtsp://l.m.cztv.com:554/hdmi/hntv1hd.stream
|
||||
广东
|
||||
广东卫视 HD=rtsp://l.m.cztv.com:554/hdmi/gdtv1hd.stream
|
||||
广东卫视 qq=http://zb.v.qq.com:1863/?progid=857894899
|
||||
广东公共=http://qqlive.dnion.com:1863/4035478592.flv
|
||||
广东新闻=http://qqlive.dnion.com:1863/2631736979.flv
|
||||
广东珠江=http://qqlive.dnion.com:1863/1926463423.flv
|
||||
广东体育=http://live.gslb.letv.com/gslb?stream_id=guangdongtiyu&tag=live&ext=m3u8&sign=live_ipad
|
||||
珠江卡通=http://qqlive.dnion.com:1863/1249794075.flv
|
||||
深圳卫视 HD=rtsp://l.m.cztv.com:554/hdmi/sztv1hd.stream
|
||||
深圳卫视 qq=http://zb.v.qq.com:1863/?progid=2220552576
|
||||
TGA游戏直播=http://qqlive.dnion.com:1863/3956944389.flv
|
||||
|
||||
安徽
|
||||
安徽卫视=http://livecdn.ahtv.cn/channels/1501/500.flv/live
|
||||
安徽影视=http://livecdn.ahtv.cn/channels/1502/500.flv/live
|
||||
合肥新闻=http://live2.hfbtv.com/channels/hftv/hfxw/flv:sd/live
|
||||
@@ -213,12 +251,16 @@ TGA游戏直播=http://qqlive.dnion.com:1863/3956944389.flv
|
||||
芜湖生活=http://live.wuhubtv.com/channels/1532/500.flv/live
|
||||
芜湖公共=http://live.wuhubtv.com/channels/1533/500.flv/live
|
||||
|
||||
|
||||
江苏
|
||||
江苏城市=rtsp://122.192.35.80:554/live/tv01
|
||||
江苏卫视=rtsp://122.192.35.80:554/live/tv02
|
||||
江苏卫视 HD=rtsp://l.m.cztv.com:554/hdmi/jstv1hd.stream
|
||||
江苏综艺=rtsp://122.192.35.80:554/live/tv03
|
||||
江苏公共=rtsp://122.192.35.80:554/live/tv51
|
||||
江苏体育休闲=rtsp://122.192.35.80:554/live/tv28
|
||||
#江苏城市=rtsp://122.192.35.80:554/live/tv01
|
||||
#江苏卫视=rtsp://122.192.35.80:554/live/tv02
|
||||
南京新闻综合=http://live.xwei.tv/channels/njtv/video_xwzh/flv:500k/live
|
||||
南京科教=http://live.xwei.tv/channels/njtv/video_kj/flv:500k/live
|
||||
南京生活=http://live.xwei.tv/channels/njtv/video_shh/flv:500k/live
|
||||
@@ -229,6 +271,10 @@ TGA游戏直播=http://qqlive.dnion.com:1863/3956944389.flv
|
||||
扬州城市=http://livemedia.yzntv.com/channels/tvie/41/flv:400k/live
|
||||
扬州生活=http://livemedia.yzntv.com/channels/tvie/42/flv:400k/live
|
||||
扬州移动=http://livemedia.yzntv.com/channels/tvie/52/flv:52/live
|
||||
南通综合=http://tsl3.hls.cutv.com/cutvlive/h1cvpVx/hls/live_sd.m3u8
|
||||
南通社教=http://tsl3.hls.cutv.com/cutvlive/18Vmk78/hls/live_sd.m3u8
|
||||
南通生活=http://tsl3.hls.cutv.com/cutvlive/SQ5Wj2s/hls/live_sd.m3u8
|
||||
南通信息=http://tsl3.hls.cutv.com/cutvlive/48zw6yd/hls/live_sd.m3u8
|
||||
南通新闻综合=http://media.ntjoy.com/channels/nttv/news/flv:TV1SD/live
|
||||
南通社教=http://media.ntjoy.com/channels/nttv/society/flv:TV2SD/live
|
||||
南通生活=http://media.ntjoy.com/channels/nttv/life/flv:TV3SD/live
|
||||
@@ -246,34 +292,12 @@ TGA游戏直播=http://qqlive.dnion.com:1863/3956944389.flv
|
||||
盐城城市公共=http://live.0515yc.tv/channels/yctv/yc3/flv:sd/live
|
||||
昆山新闻综合=http://stream.ksntv.com.cn/live/pc1?fmt=H264_450K_FLV
|
||||
|
||||
中央电台中国之声=mms://cdnmms.cnr.cn/cnr001
|
||||
中央电台音乐之声=mms://cdnmms.cnr.cn/cnr003
|
||||
中国国际电台Hit FM=mms://live.hitfm.cn/fm887
|
||||
香港电台第一台=http://202.177.192.119/radio1
|
||||
香港电台第二台=http://202.177.192.119/radio2
|
||||
旅游卫视=rtsp://122.192.35.80:554/live/tv08
|
||||
#NJTV新闻综合=rtsp://122.192.35.80:554/live/tv08
|
||||
#东方卫视=rtsp://122.192.35.80:554/live/tv11
|
||||
档案(北京)=rtsp://122.192.35.80:554/live/tv12
|
||||
#辽宁卫视=rtsp://122.192.35.80:554/live/tv16
|
||||
MursTv=rtsp://122.192.35.80:554/live/tv20
|
||||
#江苏城市=rtsp://122.192.35.80:554/live/tv01
|
||||
#江苏卫视=rtsp://122.192.35.80:554/live/tv02
|
||||
NBS新闻综合=rtsp://122.192.35.80:554/live/tv09
|
||||
#CCTV1=rtsp://122.192.35.80:554/live/tv14
|
||||
#CCTV3=rtsp://122.192.35.80:554/live/tv30
|
||||
#CCTV4=rtsp://122.192.35.80:554/live/tv07
|
||||
#CCTV6=rtsp://122.192.35.80:554/live/tv31
|
||||
靓妆=rtsp://122.192.35.80:554/live/tv50
|
||||
|
||||
|
||||
陕西
|
||||
西安文化影视=http://tsl3.hls.cutv.com/cutvlive/rd6s5B7/hls/live_sd.m3u8
|
||||
西安健康快乐=http://tsl3.hls.cutv.com/cutvlive/q0zMo5g/hls/live_sd.m3u8
|
||||
西安音乐综艺=http://tsl3.hls.cutv.com/cutvlive/xpw85wp/hls/live_sd.m3u8
|
||||
南通综合=http://tsl3.hls.cutv.com/cutvlive/h1cvpVx/hls/live_sd.m3u8
|
||||
南通社教=http://tsl3.hls.cutv.com/cutvlive/18Vmk78/hls/live_sd.m3u8
|
||||
南通生活=http://tsl3.hls.cutv.com/cutvlive/SQ5Wj2s/hls/live_sd.m3u8
|
||||
南通信息=http://tsl3.hls.cutv.com/cutvlive/48zw6yd/hls/live_sd.m3u8
|
||||
|
||||
广西
|
||||
南宁影视娱乐=http://tsl4.hls.cutv.com/cutvlive/1r8OKpx/hls/live_sd.m3u8
|
||||
南宁新闻综合=http://tsl4.hls.cutv.com/cutvlive/hGhh54l/hls/live_sd.m3u8
|
||||
南宁公共=http://tsl4.hls.cutv.com/cutvlive/U1kGA08/hls/live_sd.m3u8
|
||||
@@ -281,5 +305,10 @@ NBS新闻综合=rtsp://122.192.35.80:554/live/tv09
|
||||
柳州新闻=http://tsl4.hls.cutv.com/cutvlive/mA0cbYv/hls/live_sd.m3u8
|
||||
柳州科教=http://tsl4.hls.cutv.com/cutvlive/2Lie8os/hls/live_sd.m3u8
|
||||
柳州公共=http://tsl4.hls.cutv.com/cutvlive/R0Sqiur/hls/live_sd.m3u8
|
||||
大连新闻综合=http://tsl2.hls.cutv.com/cutvlive/Wrezdc5/hls/live_sd.m3u8
|
||||
烟台新闻综合=http://tsl2.hls.cutv.com/cutvlive/rL8910q/hls/live_sd.m3u8
|
||||
|
||||
Radio
|
||||
中央电台中国之声=mms://cdnmms.cnr.cn/cnr001
|
||||
中央电台音乐之声=mms://cdnmms.cnr.cn/cnr003
|
||||
中国国际电台Hit FM=mms://live.hitfm.cn/fm887
|
||||
香港电台第一台=http://202.177.192.119/radio1
|
||||
香港电台第二台=http://202.177.192.119/radio2
|
||||
|
||||
@@ -40,7 +40,7 @@ VideoGroup::VideoGroup(QObject *parent) :
|
||||
, vid("qpainter")
|
||||
{
|
||||
mpPlayer = new AVPlayer(this);
|
||||
mpPlayer->setPlayerEventFilter(0);
|
||||
//mpPlayer->setPlayerEventFilter(0);
|
||||
|
||||
mpBar = new QWidget(0, Qt::WindowStaysOnTopHint);
|
||||
mpBar->setMaximumSize(400, 60);
|
||||
|
||||
@@ -84,10 +84,6 @@ void AVOutput::pause(bool p)
|
||||
if (d.paused == p)
|
||||
return;
|
||||
d.paused = p;
|
||||
#if V1_2
|
||||
if (!d.paused)
|
||||
d.cond.wakeAll();
|
||||
#endif //V1_2
|
||||
}
|
||||
|
||||
bool AVOutput::isPaused() const
|
||||
|
||||
@@ -149,20 +149,6 @@ void AVPlayer::clearVideoRenderers()
|
||||
void AVPlayer::setRenderer(VideoRenderer *r)
|
||||
{
|
||||
qDebug(">>>>>>>>>>%s", __FUNCTION__);
|
||||
#if V1_2
|
||||
if (_renderer && r) {
|
||||
VideoRenderer::OutAspectRatioMode oar = _renderer->outAspectRatioMode();
|
||||
r->setOutAspectRatioMode(oar);
|
||||
if (oar == VideoRenderer::CustomAspectRation) {
|
||||
r->setOutAspectRatio(_renderer->outAspectRatio());
|
||||
}
|
||||
}
|
||||
setAVOutput(_renderer, r, video_thread);
|
||||
if (_renderer) {
|
||||
qDebug("resizeRenderer after setRenderer");
|
||||
_renderer->resizeRenderer(_renderer->rendererSize()); //IMPORTANT: the swscaler will resize
|
||||
}
|
||||
#else
|
||||
VideoRenderer *vo = renderer();
|
||||
if (vo && r) {
|
||||
VideoRenderer::OutAspectRatioMode oar = vo->outAspectRatioMode();
|
||||
@@ -178,20 +164,14 @@ void AVPlayer::setRenderer(VideoRenderer *r)
|
||||
r->setStatistics(&mStatistics);
|
||||
clearVideoRenderers();
|
||||
addVideoRenderer(r);
|
||||
|
||||
#endif //V1_2
|
||||
}
|
||||
|
||||
VideoRenderer *AVPlayer::renderer()
|
||||
{
|
||||
#if V1_2
|
||||
return _renderer;
|
||||
#else
|
||||
//QList assert empty in debug mode
|
||||
if (mpVOSet->outputs().isEmpty())
|
||||
return 0;
|
||||
return static_cast<VideoRenderer*>(mpVOSet->outputs().last());
|
||||
#endif //V1_2
|
||||
}
|
||||
|
||||
QList<VideoRenderer*> AVPlayer::videoOutputs()
|
||||
@@ -947,9 +927,6 @@ bool AVPlayer::setupVideoThread()
|
||||
}
|
||||
}
|
||||
}
|
||||
#if V1_2
|
||||
setRenderer(_renderer);
|
||||
#endif
|
||||
int queue_min = 0.61803*qMax<qreal>(24.0, mStatistics.video.fps);
|
||||
int queue_max = int(1.61803*(qreal)queue_min); //about 1 second
|
||||
video_thread->packetQueue()->setThreshold(queue_min);
|
||||
|
||||
@@ -110,18 +110,11 @@ bool EventFilter::eventFilter(QObject *watched, QEvent *event)
|
||||
AVPlayer *player = static_cast<AVPlayer*>(parent());
|
||||
if (!player)
|
||||
return false;
|
||||
#if 0 //TODO: why crash on close?
|
||||
if (player->renderer()->widget() != watched
|
||||
&& (QGraphicsObject*)player->renderer()->graphicsItem() != watched) {
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
#ifndef QT_NO_DYNAMIC_CAST //dynamic_cast is defined as a macro to force a compile error
|
||||
if (player->renderer() != dynamic_cast<VideoRenderer*>(watched)) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
#endif //0
|
||||
QEvent::Type type = event->type();
|
||||
switch (type) {
|
||||
case QEvent::KeyPress: {
|
||||
@@ -132,11 +125,6 @@ bool EventFilter::eventFilter(QObject *watched, QEvent *event)
|
||||
case Qt::Key_C: //capture
|
||||
player->captureVideo();
|
||||
break;
|
||||
case Qt::Key_I: { //Interpolation
|
||||
VideoRenderer *renderer = player->renderer();
|
||||
renderer->setQuality(VideoRenderer::Quality(((int)renderer->quality()+1)%3));
|
||||
}
|
||||
break;
|
||||
case Qt::Key_N: //check playing?
|
||||
player->playNextFrame();
|
||||
break;
|
||||
|
||||
@@ -55,30 +55,6 @@ Filter::~Filter()
|
||||
void Filter::process(FilterContext *&context, Statistics *statistics, QByteArray* data)
|
||||
{
|
||||
DPTR_D(Filter);
|
||||
#if V1_2
|
||||
if (!context || context->type() != contextType()) {
|
||||
if (context) {
|
||||
qDebug("incompatible context type");
|
||||
//we don't delete it because the context MUST be used by other filters
|
||||
//TODO: How to release them at the end? refcount?
|
||||
} else {
|
||||
qDebug("null context");
|
||||
}
|
||||
//use internal context
|
||||
if (d.context) {
|
||||
qDebug("replace context with internal one");
|
||||
context = d.context;
|
||||
} else {
|
||||
context = FilterContext::create(contextType());
|
||||
qDebug("new filter context=%p, type=%d", context, contextType());
|
||||
context->video_width = statistics->video_only.width;
|
||||
context->video_height = statistics->video_only.height;
|
||||
}
|
||||
}
|
||||
//if (data)
|
||||
context->initializeOnData(data);
|
||||
d.context = context;
|
||||
#else
|
||||
if (!d.context) {
|
||||
d.context = FilterContext::create(contextType());
|
||||
d.context->video_width = statistics->video_only.width;
|
||||
@@ -97,7 +73,6 @@ void Filter::process(FilterContext *&context, Statistics *statistics, QByteArray
|
||||
d.context->shareFrom(context);
|
||||
d.context->initializeOnData(data);
|
||||
context->shareFrom(d.context);
|
||||
#endif //V1_2
|
||||
d.statistics = statistics;
|
||||
process();
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public:
|
||||
#endif
|
||||
QString path(dir + "/" + name + "." + format.toLower());
|
||||
qDebug("Saving capture to %s", qPrintable(path));
|
||||
bool ok = image.save(path, format.toLatin1().constData(), quality);
|
||||
bool ok = image.save(path, format.toLatin1().constData(), quality);
|
||||
if (!ok) {
|
||||
cap->error = VideoCapture::SaveError;
|
||||
qWarning("Failed to save capture");
|
||||
|
||||
@@ -71,6 +71,23 @@ bool VideoOutputEventFilter::eventFilter(QObject *watched, QEvent *event)
|
||||
case Qt::Key_F:
|
||||
switchFullScreen();
|
||||
break;
|
||||
case Qt::Key_I:
|
||||
mpRenderer->setQuality(VideoRenderer::Quality(((int)mpRenderer->quality()+1)%3));
|
||||
break;
|
||||
case Qt::Key_T: {
|
||||
QWidget *w = mpRenderer->widget()->window();
|
||||
Qt::WindowFlags wf = w->windowFlags();
|
||||
if (wf & Qt::WindowStaysOnTopHint) {
|
||||
qDebug("Window not stays on top");
|
||||
w->setWindowFlags(wf & ~Qt::WindowStaysOnTopHint);
|
||||
} else {
|
||||
qDebug("Window stays on top");
|
||||
w->setWindowFlags(wf | Qt::WindowStaysOnTopHint);
|
||||
}
|
||||
//call setParent() when changing the flags, causing the widget to be hidden
|
||||
w->show();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -86,13 +86,8 @@ void VideoThread::run()
|
||||
{
|
||||
DPTR_D(VideoThread);
|
||||
//TODO: no d.writer is ok, just a audio player
|
||||
#if V1_2
|
||||
if (!d.dec || !d.dec->isAvailable() || !d.writer)// || !d.conv)
|
||||
return;
|
||||
#else
|
||||
if (!d.dec || !d.dec->isAvailable() || !d.outputSet)// || !d.conv)
|
||||
return;
|
||||
#endif //V1_2
|
||||
resetState();
|
||||
Q_ASSERT(d.clock != 0);
|
||||
VideoDecoder *dec = static_cast<VideoDecoder*>(d.dec);
|
||||
@@ -159,19 +154,6 @@ void VideoThread::run()
|
||||
}
|
||||
}
|
||||
d.clock->updateVideoPts(pkt.pts); //here?
|
||||
#if V1_2
|
||||
//DO NOT decode and convert if vo is not available or null!
|
||||
//NOTE: vo may changes dymanically. we need check it every time we use it. decoder and other components should do this too
|
||||
VideoRenderer* vo = static_cast<VideoRenderer*>(d.writer);
|
||||
bool vo_ok = vo && vo->isAvailable();
|
||||
if (vo_ok) {
|
||||
//use the last size first then update the last size so that decoder(converter) can update output size
|
||||
if (vo->lastWidth() > 0 && vo->lastHeight() > 0 && !vo->scaleInRenderer())
|
||||
dec->resizeVideoFrame(vo->lastSize());
|
||||
else
|
||||
vo->setInSize(dec->width(), dec->height()); //setLastSize(). optimize: set only when changed
|
||||
}
|
||||
#else
|
||||
if (need_update_vo_parameters || !d.update_outputs.isEmpty()) {
|
||||
//lock is important when iterating
|
||||
d.outputSet->lock();
|
||||
@@ -194,7 +176,6 @@ void VideoThread::run()
|
||||
}
|
||||
QMutexLocker locker(&d.mutex);
|
||||
Q_UNUSED(locker);
|
||||
#endif //V1_2
|
||||
//still decode, we may need capture. TODO: decode only if existing a capture request if no vo
|
||||
if (dec->decode(pkt.data)) {
|
||||
d.pts = pkt.pts;
|
||||
@@ -219,11 +200,6 @@ void VideoThread::run()
|
||||
}
|
||||
}
|
||||
}
|
||||
#if V1_2
|
||||
if (vo_ok) {
|
||||
vo->writeData(data);
|
||||
}
|
||||
#else
|
||||
//while can pause, processNextTask, not call outset.puase which is deperecated
|
||||
while (d.outputSet->canPauseThread()) {
|
||||
if (d.stop) {
|
||||
@@ -239,13 +215,7 @@ void VideoThread::run()
|
||||
break;
|
||||
}
|
||||
d.outputSet->sendData(data);
|
||||
#endif //V1_2
|
||||
}
|
||||
#if V1_2
|
||||
//use the last size first then update the last size so that decoder(converter) can update output size
|
||||
if (vo_ok && !vo->scaleInRenderer())
|
||||
vo->setInSize(vo->rendererSize());//out size?
|
||||
#endif //V1_2
|
||||
}
|
||||
qDebug("Video thread stops running...");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user