1. 程式人生 > >在QT中播放聲音 MPlayer+libphonon_mp.so和QProgress+Mplayer跨平臺播放MP3方案

在QT中播放聲音 MPlayer+libphonon_mp.so和QProgress+Mplayer跨平臺播放MP3方案

移植mplayermini2440(成功)(其中包含編譯Mplayer時遇到的幾個錯誤解決方法)

Qt Phonon介紹及安裝()

Mplayer成為Linux系統下的萬能播放器

繞過phonon,直接操作mplayer的原始碼

其他參考文件:

CentosQt Phonon播放器製作.pdf

基於ARMMplayer播放器的移植.doc

MPlayerlinux下安裝.pdf

QT中播放聲音

1.安裝madplay。用system("/../..");

2.安裝phonon,在命令列下輸入sudoapt-get install libphonon-dev安裝phonon就可以使用#include <phonon>檔案了(不過在.pro必須包含QT += phonon這條語句)。

使用語句:

Phonon::MediaObject*music=Phonon::createPlayer(Phonon::MusicCategory,Phonon::MediaSource("/home/myprogram/qt/QTFaceRec-build-desktop/test.wav"));

music->play();
還可以播放視訊:Phonon::MediaObject*movie=Phonon::createPlayer(Phonon::VideoCategory,Phonon::MediaSource("/home/XX.avi"));movie->play();

3.QSoundbells("mysounds/apple.wav");

bells.play();

此方法在ubuntu上操作不成功,且要用絕對路徑,不過將音訊檔案加入資原始檔當中。只能用wav格式。

Qt Phonon介紹及安裝()

目前在Qt 4.6中實現多媒體播放圖形介面主要依賴於phonon框架,其實qt5.0開始新增一個Multimedia模組,幫助文件中對它的描述是:實現底層的多媒體播放功能,在一般情況下上層的介面phonon模組更適合實現這些功能。在官方部落格上了解到Qt有放棄phonon的打算,將多媒體的功能放到正在進行的Mobility專案中實現。先不管那麼多了吧,至少目前我們還只能選擇phonon,那就先了解一下吧。

phonon最初是一個源於KDE

的專案,為使用音訊和視訊的應用程式開發提供的一個框架。應用程式不用去管多媒體播放是通過什麼實現的(如gstreamerxine),只需呼叫相應的介面就行,但這中間需要一箇中轉,被稱為backendQt也是通過phonon來實現誇平臺的多媒體播放。

多媒體檔案的播放主要過程包括:檔案讀取、分流、解碼、輸出。

這些在不同的系統中實現方式不同,如windows下的DirectXLinux下的 gstreamerxineMac下的QuickTime。而Qt中的phonon作為誇平臺的多媒體解決方案,就因該為使用者遮蔽掉這些差異。而實際上它做得還不夠好,因為使用者還需要自己來安裝相應的後端外掛來完成播放任務。

應用程式與phonon庫及後端的關係如下:(圖片丟失)

如果想要執行使用Qt中的phonon寫的程式,需要滿足一下條件:Qt基本庫、Qt phonon庫、phonon_backend(後端外掛)和多媒體播放後臺。

下面以linuxFedora 12)系統、Qt 4.6mplayer為例,假設Qt基本庫已經安裝好,預設phonon是沒有被安裝的,介紹phonon和後端外掛的安裝。

Phonon庫安裝:

進入原始碼的phonon目錄,如"/usr/src/qt-everywhere-opensource-src-4.6.0/src/phonon",實際程式碼並不在裡面,從phonon.pro檔案可知原始碼在“/src/3rdparty/phonon/phonon,但並不影響編譯。在終端輸入“make;make install”即可,如果安裝時出錯,也可手動將libinclude下相關檔案拷貝到安裝目錄。

qmakemake一下就會在xxx/qt/lib下生成libphonon.lalibphonon.solibphonon.so.4libphonon.so.4.3libphonon.so.4.3.1

編譯phonon後, phonon程式已經可以編譯了。(此處如果要準備一直到ARM平臺,則需要用ARM版本的QT進行再次編譯生成ARM平臺用的對應的上面幾個庫檔案。)可以把Qt demo中的mediaplayermusicplayer拿來編譯,都可以生產可執行檔案,也可以執行。但是執行時會彈出phononbackend plugin could not be loaded。這就是缺少後端外掛的情況,這時的程式除了顯示出介面什麼都不能幹。這時候需要編譯phonon backend後端外掛

說明:幫助文件中介紹LinuxQt預設只支援gstreamer,其它的不做保證。但實際中由於mplayer安裝比較方便,支援的檔案格式全,使用的人也非常多,所以我以mplayer為例。而gstreamer的後端外掛可以在系統的“/usr/lib64/kde4/plugins /phonon_backend”目錄直接找到(如果已經從源上安裝了的話)。

因為linux的解碼播放後端預設是gstreamer,但QT並沒有提供對應的後端外掛。

所以得另外找個解決辦法:利用mplayer做後端(此mplayer播放器一定需要在linux下安裝,可通過線上yum下載,或者下載原始碼編譯),然後再另外做一個後端外掛。

可以從官方網站下載原始碼編譯安裝後端外掛:

1)下載phonon-mplayer

地址:http://websvn.kde.org/trunk/playground/multimedia/phonon-backends/mplayer/

使用svn下載: svn cosvn://anonsvn.kde.org/home/kde/trunk/playground/multimedia/phonon-backends/mplayer

2)返回phonon-mplayer目錄,編譯(qmakemake)生成phonon_backend/libphonon_mplayer.so動態連結庫。

3)將libphonon_mplayer.so拷貝到$QTDIR/plugins/phonon_backend/

為了編譯方便,基於mplayer的後端外掛網上已經有人做好,但有些問題,附上我修改過的phonon-mplayer.tar.gz

編譯方法:

進入phonon-mplayer.tar.gz解壓出來後的目錄

1.進入/phonon-mplayer/libmplayer目錄,

make distclean
qmake
make

//之後會在當前位置生成一個libmplayer.a

2.進入/phonon-mplayer/目錄

make distclean
qmake
make

//之後會在當前位置生成一個libphonon_mp.so,這個就是我們要的外掛

PS:由於這個後端外掛裡面有幾個目錄變數是直接改成我電腦裡的絕對地址的,所以編譯過程中如果有提示找不到XX檔案,請將對應的變數改成你對應目錄地址。

/phonon_mplayer/phonon_mp.pro的內容:

include(/home/michael/qtsdk-2009.05/qt/src/plugins/qpluginbase.pri)//這裡的包含內容要改回你對應QT檔案的地址。

這裡如果QT環境已經配置好,可以通過qmake –project直接重新生成.pro檔案,然後再qmake生成makefile檔案,再清除原有編譯檔案,再執行make。但要注意是X11平臺還是ARM平臺的QT版本。

然後將libphonon_mp.so複製到QT目錄下的/qt/plugins/phonon_backend(如果沒有phonon_backend這個目錄就新建一個,我就是自己新建一個的-_-!)

如果前面的mplayer前端已經安裝好,這樣程式就可以找到backend了。否則還需要安裝Mplayer前端播放器。下面會具體講解安裝前端播放器。

以上就是如何編譯後端外掛的方法。如果要使得QT能呼叫mplayer,還得安裝一個 Mplayer,也就是安裝一個後端。經個人測試,mplayer直接用apt-getyum從源獲取安裝最穩定,用原始碼編譯,即使成功也有可能會出現一些未知問題-_-.

這樣在X11平臺就可以順利播放MP3等格式的音樂以及其他格式的視訊檔案。

但是如果需要移植到ARM平臺,則還需要ARM版本的Mplayer前端播放器,這時一般就需要自己通過對應版本交叉編譯器進行編譯了,官方原始碼下載:http://www.mplayerhq.hu/MPlayer/releases/

該過程我遇到以下幾個問題:

1、 廣州天嵌TQ210開發板提供的製作好的檔案系統中rootfs_linux_v1.1,在根目錄sbin資料夾下,已經放置了一個Mplayer播放器程式,經過測試發現該版本為"MPlayerdev-CVS-060102-15:04-4.4.6 (C) 2000-2005 MPlayerTeam",應該是4.4.6交叉編譯器編譯的,手動操作通過對應目錄下./mplayer/opt/bj.mp3播放音樂檔案可以正常播放,但是與我自己4.3.3版本編譯的libphonon_mp.so後端外掛不相容,導致我自己寫的程式無法播放MP3檔案。還出現以下不識別版本的錯誤:

MPlayer: "MPlayer dev-CVS-060102-15:04-4.4.6(C) 2000-2005 MPlayer Team"
parse MPlayer version: "dev"
Error: unknown MPlayer version
Error: couldn't parse MPlayer revision: "dev"

2、 有人說arm-linux-gcc交叉編譯器最好是:arm-linux-gcc-4.3.2版本,我用網友編譯好的4.3.2版本的Mplayer做前端放在ARM檔案系統中測試時,確實可以手動呼叫mplayer進行播放MP3等檔案,呼叫方法如到播放器檔案對應目錄下./mplayer/opt/bj.mp3,但實際遇到4.3.2交叉編譯器編譯的Mplayer版本與我自己4.3.3版本編譯的libphonon_mp.so後端外掛不相容的情況,導致我自己寫的程式無法播放MP3檔案,實際播放過程中出現過播放2秒聲音後就停止的情況。

3、 後來我偶然在廣州華天正公司的Real210開發板的光碟檔案中找到了4.4.1版本交叉編譯器編譯的Mplayer程式替換後,與我的4.3.3版本libphonon_mp.so後端外掛配合起來,可以正常播放音樂。

大功告成!

示例測試 :

examples/phonon/qmusicplayer下的例子用mplayer做後端播放音樂會有問題,我使用demos/qmediaplayer

當然也可以用一個簡單的例子,如下:

#include <QtGui>

#include <Phonon/MediaObject>
#include <Phonon/VideoPlayer>
#include <Phonon/BackendCapabilities>

int main(int argv, char **args)
{
    QApplication app(argv, args);
    Phonon::MediaObject *music =
         Phonon::createPlayer(Phonon::MusicCategory, Phonon::MediaSource("/home/dlw/Music/mxshf.mp3"));
     music->play();
     /* 視訊播放
     Phonon::MediaObject *music =
 Phonon::createPlayer(Phonon::VideoCategory, Phonon::MediaSource("/media/DLW/movie/One.Night.in.Supermarket.avi"));  

    music->play();
     */
    return app.exec(); 

} 

由於本人暫時未進行親自手動編譯MPlayer原始碼,這裡先附上2個不同網友提供的編譯步驟:

1.下載相關codes ( http://www.mplayerhq.hu/MPlayer/ )主要都在這裡Mplayer-1.0rc1.tar.bz2(主程式)(http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc1.tar.bz2 )
Abyss-1.6.tar.bz2(面板
)(http://www2.mplayerhq.hu/MPlayer/skins/Abyss-1.6.tar.bz2)
all-20060611.tar.bz2(http://www.mplayerhq.hu/MPlayer/releases/codecs/all-20060611.tar.bz2)
windows-all-20060611.zip(建議不要在win下使用. rar,
. zip)
(http://www.mplayerhq.hu/MPlayer/releases/codecs/windows-all-20060611.zip )
  這是我的mplayer的一些元件,你可以去http://www.mplayerhq.hu/MPlayer/下載你自己喜歡的面板和字型
.
2.安裝過程(請把你的終端開啟
)
a.安裝相應的解碼
  進入主目錄後,root身份安裝 ,這樣改變身份:在終端輸入su或者su root ,然後輸入密碼就ok,有沒有看到 $變成了 #
  接著
mkdir/usr/lib/codecs
mkdir/usr/lib/wincodecs
tar jxvfall-20060611.tar.bz2
mvall-20060611/* /usr/lib/codecs
unzipwindows-all-20060611.zip
mvwindows-all-20060611/* /usr/lib/wincodecs
b.安裝
mplayer
tar jxvfMPlayer-1.0rc1.tar.bz2
cdMPlayer-1.0rc1
./configure--prefix=/usr/local/mplayer --enable-gui
--enable-freetype --with-codecsdir=/usr/lib/codecs/
--with-win32libdir=/usr/lib/wincodecs/ --language=zh_CN
  注意
:
--prefix=/usr/local/mplayer是安裝路徑
--enable-gui 安裝圖形化使用者介面--enable-freetype調節字型--with-codecsdir=/usr/lib/codecs/
--with-win32libdir=/usr/lib/wincodecs指定解碼位置
--language=zh_CN中文  接著make
make install
c.安裝面板
tar jxvfAbyss-1.6.tar.bz2
mv Abyss/usr/local/mplayer/share/mplayer/skins/
cd/usr/local/mplayer/share/mplayer/skins/
mv Abyssdefault
  至此mplayer已經成為了萬能播放器
  執行程式在/usr/local/mplayer/bin  你可以在終端中輸入gmplayer,也可以在桌面建立起動器來使用mplayer
  趕緊執行一下,看看有沒有問題
  你一定會發現我們還沒有裝字型,執行mplayer後它也會提示沒有字型  你就從自己電腦中拷個字型到主目錄下的.mplayer資料夾下,並把你的字型改名為subfont.ttf,問題就解決了,或者做個連結也行,只要你喜歡  字型你可以上網下載,mplayer網站也有,你電腦裡也有字型,在/usr/share/fonts/chinese(/usr
/share/fonts/chinese/TrueType/uming.ttf
就可以用)你就直接
cp
/usr/share/fonts/chinese/TrueType/uming.ttf $HOME/.mplayer
  每個使用者都有自己的環境變數HOME,cd $HOME/.mplayer接著mv uming.ttfsubfont.ttf結束

1.先把環境變數設定成QTE命令:exportPATH=/usr/local/Trolltech/QtEmbedded-4.6.3/bin/:$PATH

2.QTE下面./configure-phonon -phonon-backend

3.QTE的目錄下的/opt/qte/qt-everywhere-opensource-src-4.6.3/src/phonon執行make完成後會在/opt/QTE/qt-everywhere-opensource-src-4.6.3/lib/下面生成7libphonon的庫檔案.

4.將生成的庫檔案拷貝到/usr/local/Trolltech/QtEmbedded-4.6.3/lib/

5.將解壓後的phonon-mplayer檔案拷貝到/opt/qte/qt-everywhere-opensource-src-4.6.3/src/plugins/phonon/

6.進入此目錄執行 make生成libphonon_mp.so庫檔案,將此庫檔案拷貝到

/usr/local/Trolltech/QtEmbedded-4.6.3/plugins/phonon_backend/其中phonon_backend是自己建立的目錄。

7.進入解壓後的MPlayer-1.0rc2目錄執行./configuremake make install完成後到

QTX11/qt-everywhere-opensource-src-4.6.3/demos/qmediaplayer/執行make執行生成的可執行檔案。不出意外的話會開啟。

8.phonon編譯不過去envQTLIB QTINC QTDIR 修改成當前用的qtlib includedir把安裝包中的/opt/qte/qt-every-opensource/src檔案拷貝到安裝目錄下:/usr/local/Trolltech/QtEmbedded-4.6.3/C6410MPlayer-1.0rc2的過程./configure --host-cc=gcc --cc=arm-linux-gcc --target=arm-linux --enable-static--disable-win32dll --disable-dvdread --disable-dvdread-internal--disable-dvdnav --disable-libdvdcss-internal --enable-fbdev --disable-mencoder--disable-live --disable-mp3lib --enable-mad --enable-libavcodec_a--disable-live --disable-ivtv --with-extraincdir=/media/new_sd/tmp/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include/./configure --cc=arm-linux-gcc --target=arm-linux --enable-static--prefix=/opt/mplayer --disable-win32dll --disable-dvdread --enable-fbdev--disable-mencoder --disable-live --disable-mp3lib --enable-mad--enable-libavcodec_a --language=zh_CN --disable-armv5te --disable-armv6--with-extraincdir=/usr/local/arm/include --with-extralibdir=/usr/local/arm/lib

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

除了上面通過phonon方式進行跨平臺播放聲音檔案,還可以通過QProgress+MPlayer方式進行播放聲音視訊檔案。

繞過phonon,直接操作mplayer的原始碼

想在嵌入式上實現一個多媒體播放器,覺得用Phonon開銷太大了,但如果只用QProcess又無法獲得觸控式螢幕事件,不方便和使用者互動,所以打算直接參考smplayer寫,今天無意中看到了一個法國人寫的原始碼,比smplayer小多了,看起來更方便,所以就傳上來了,希望對大家有幫助

下面為附件中main.cpp完整原始碼,該附件僅有這一個單檔案,非常好參考。

#include <QApplication>
#include <QProcess>
#include <QVBoxLayout>
#include <QLayoutItem>
#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QColor>
#include <QRect>
#include <QLinearGradient>
#include <QSizePolicy>
#include <QPushButton>
#include <QTextEdit>
#include <QSlider>
#include <QCloseEvent>
#include <QTimer>

#ifdef Q_OS_WIN32
const QString mplayerPath("win32/mplayer.exe");
#else
const QString mplayerPath("mplayer");
#endif
const QString movieFile("huantaihu.mp4");

class PlayerWidget: public QWidget
{
	Q_OBJECT

public:
	PlayerWidget(QWidget *parent =0)
		:QWidget(parent), isPlaying(false)
	{
		controller = new QPushButton("Play");
		
		renderTarget = new QWidget(this);
		renderTarget->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
		renderTarget->setAttribute(Qt::WA_PaintOnScreen);
		renderTarget->setMinimumSize(176, 144);
		
		timeLine = new QSlider(Qt::Horizontal);

		log = new QTextEdit;
		log->setReadOnly(true);

		QVBoxLayout *layout = new QVBoxLayout;
		layout->addWidget(controller);
		layout->addWidget(renderTarget);
		layout->addWidget(timeLine);
		layout->addWidget(log);
		setLayout(layout);

		mplayerProcess = new QProcess(this);

		poller = new QTimer(this);

		connect(controller, SIGNAL(clicked()), this, SLOT(switchPlayState()));
		connect(mplayerProcess, SIGNAL(readyReadStandardOutput()),
			this, SLOT(catchOutput()));
		connect(mplayerProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
			this, SLOT(mplayerEnded(int, QProcess::ExitStatus)));
		connect(poller, SIGNAL(timeout()), this, SLOT(pollCurrentTime()));
		connect(timeLine, SIGNAL(sliderMoved(int)), this, SLOT(timeLineChanged(int)));
	}

protected:
	virtual void closeEvent(QCloseEvent *e)
	{
		stopMPlayer();
		e->accept();
	}

private:
	bool startMPlayer()
	{
		if(isPlaying)
			return true;

		QStringList args;
		
		// On demande ?utiliser mplayer comme backend
		args << "-slave";
		// Et on veut ne pas avoir trop de chose ?parser :)
		args << "-quiet";
#ifdef Q_WS_WIN
		// reinterpret_cast<qlonglong> obligatoire, winId() ne se laissant pas convertir gentiment ;)
		args << "-wid" << QString::number(reinterpret_cast<qlonglong>(renderTarget->winId()));
		args << "-vo" << "directx:noaccel";
#else
		// Sur linux, aucun driver n'a 閠?n閏essaire et pas de manip pour Wid :)
		args << "-wid" << QString::number(renderTarget->winId());

		log->append("Video output driver may not be necessary for your platform. \
					Check: http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html \
					at the VIDEO OUTPUT DRIVERS section.");
#endif
		
		args << movieFile;

		// On parse la stdout et stderr au m阭e endroit, donc on demande ?"fusionnner" les 2 flux
		mplayerProcess->setProcessChannelMode(QProcess::MergedChannels);
		mplayerProcess->start(mplayerPath, args);
		if(!mplayerProcess->waitForStarted(3000))
		{
			qDebug("allez, cherche le bug :o");
			return false;
		}

		// On r閏up鑢e les infos de base
		mplayerProcess->write("get_video_resolution\n");
		mplayerProcess->write("get_time_length\n");

		poller->start(1000);

		isPlaying = true;

		return true;
	}

	bool stopMPlayer()
	{
		if(!isPlaying)
			return true;

		mplayerProcess->write("quit\n");
		if(!mplayerProcess->waitForFinished(3000))
		{
			qDebug("ZOMG, 鏰 plante :(");
			return false;
		}

		return true;
	}

private slots:
	void catchOutput()
	{
		while(mplayerProcess->canReadLine())
		{
			QByteArray buffer(mplayerProcess->readLine());
			log->append(QString(buffer));
			
			// On v閞ifie si on a eu des r閜onses
			// r閜onse ?get_video_resolution : ANS_VIDEO_RESOLUTION='<width> x <height>'
			if(buffer.startsWith("ANS_VIDEO_RESOLUTION"))
			{
				buffer.remove(0, 21); // vire ANS_VIDEO_RESOLUTION=
				buffer.replace(QByteArray("'"), QByteArray(""));
				buffer.replace(QByteArray(" "), QByteArray(""));
				buffer.replace(QByteArray("\n"), QByteArray(""));
				buffer.replace(QByteArray("\r"), QByteArray(""));
				int sepIndex = buffer.indexOf('x');
				int resX = buffer.left(sepIndex).toInt();
				int resY = buffer.mid(sepIndex+1).toInt();
				renderTarget->setMinimumSize(resX, resY);
			}
			// r閜onse ?get_time_length : ANS_LENGTH=xx.yy
			else if(buffer.startsWith("ANS_LENGTH"))
			{
				buffer.remove(0, 11); // vire ANS_LENGTH=
				buffer.replace(QByteArray("'"), QByteArray(""));
				buffer.replace(QByteArray(" "), QByteArray(""));
				buffer.replace(QByteArray("\n"), QByteArray(""));
				buffer.replace(QByteArray("\r"), QByteArray(""));
				float maxTime = buffer.toFloat();
				timeLine->setMaximum(static_cast<int>(maxTime+1));
			}
			// r閜onse ?get_time_pos : ANS_TIME_POSITION=xx.y
			else if(buffer.startsWith("ANS_TIME_POSITION"))
			{
				buffer.remove(0, 18); // vire ANS_TIME_POSITION=
				buffer.replace(QByteArray("'"), QByteArray(""));
				buffer.replace(QByteArray(" "), QByteArray(""));
				buffer.replace(QByteArray("\n"), QByteArray(""));
				buffer.replace(QByteArray("\r"), QByteArray(""));
				float currTime = buffer.toFloat();
				timeLine->setValue(static_cast<int>(currTime+1));
			}
		}
	}

	void pollCurrentTime()
	{
		mplayerProcess->write("get_time_pos\n");
	}

	// Dirige la timeline
	void timeLineChanged(int pos)
	{
		mplayerProcess->write(QString("seek " + QString::number(pos) + " 2\n").toUtf8());
	}

	// Play/stop
	void switchPlayState()
	{
		if(!isPlaying)
		{
			if(!startMPlayer())
				return;

			log->clear();
			controller->setText("Stop");
			isPlaying = true;
		}
		else
		{
			if(!stopMPlayer())
				return;

			poller->stop();
			log->clear();
			controller->setText("Play");
			isPlaying = false;
		}
	}

	void mplayerEnded(int exitCode, QProcess::ExitStatus exitStatus)
	{
		isPlaying = false;
		controller->setText("Play");
		poller->stop();
	}

private:
	QPushButton *controller;
	QWidget *renderTarget;
	QProcess *mplayerProcess;
	bool isPlaying;
	QSlider *timeLine;
	QTimer *poller;
	QTextEdit *log;
};

int main(int argc, char **argv)
{
	QApplication app(argc, argv);

	PlayerWidget *pw = new PlayerWidget;
	pw->show();

	return app.exec();
}

#include "main.moc"

上面的示例程式能夠正常播放聲音和視訊檔案,但是在win7系統下播放視訊時,對於顯示卡的配色方案會造成一定影響,而下面的一個示例程式儘管設計的目標平臺為linux,但可以與上面的進行結合程式碼修正,應該會達到一個完善跨平臺PClinux的播放器效果。

此處跨平臺時,在PC平臺上需要呼叫一個mplayer-core.exe的外掛檔案。可以直接搜尋下載。而在linux平臺下只需要安裝好對應版本的mplayer播放器前端即可,此處可以不需要用phonon_backend後端外掛。

QT 4.6.0 Mplayer實現媒體播放器

QT 4.6.0  Mplayer實現媒體播放器,雖然有些重複了,但是絕對不是抄襲,有些東西是自己折騰出來的,比較實用!前提是你的系統必須安裝有mplayer播放器。這種軟體的實現原理很簡單,我們實質上只做了個外殼,呼叫了mplayer提供的一個介面,把它的資料輸入到我們指定的widget上,這種做法不是跨平臺的,程式在
  windows
下面無法執行。想實現在windows下面用的,可以去呼叫Active X控制元件,qt支援這種做法,因為windows裡面做這種東西太簡單,我們也就不以為奇了!有些朋友會問都支援些什麼格式之類的問題,答案就是mplayer可以做的事情,播放器就可以做,取決於你想把它做多複雜了!linux下面很多播放器都是用mplayer
 
做後臺,加個漂亮的外殼,功能相當強大!貼個圖:
 
       window.open('http://www.qtcn.org/bbs/attachment/Mon_1106/44_82966_42bc76e710e184e.jpg?62');"  style="max-width:700px;max-height:700px;"  onload="if(this.offsetWidth>'700')this.width='700';if(this.offsetHeight>'700')this.height='700';"  >

圖片:big-1.jpg

圖片:big-2.jpg

描述:QT 4.6.0  Mplayer 實現媒體播放器附件下載次數:3160

關於qt下使用mplayer的問題!

最近在研究qt中播放音樂的問題。最終鎖定用mplayer然後下載了一個安裝。直接呼叫安裝之後的mplayer.exe引數跟一個MP3檔案。沒有問題。之後發現安裝資料夾下有個mplayer-core.exe
然後把mplayer解除安裝了。把這個mplayer-core.exe複製到程式碼目錄下。利用這個檔案還是可以播放。我的問題是:這個檔案有12.9M大。難道釋出程式的時候,和這個程式一起釋出?大家用mplayer程式設計序的時候是怎麼使用mplayer的呢?

1發表於: 2009-12-06

如果是Linux,不用考慮mplayer,因為幾乎所有的系統都有這個東西。

2發表於: 2009-12-06

我的是windows
沒有這個啊~
我自己安裝後提取mplayer-core.exe檔案到程式碼目錄下的。!

繞過phonon,直接操作mplayer的原始碼

想在嵌入式上實現一個多媒體播放器,覺得用Phonon開銷太大了,但如果只用QProcess又無法獲得觸控式螢幕事件,不方便和使用者互動,所以打算直接參考smplayer寫,今天無意中看到了一個法國人寫的原始碼,比smplayer小多了,看起來更方便,所以就傳上來了,希望對大家有幫助

一個完整的音樂播放器原始碼

圖片:1.jpg 

圖片:2.jpg


附件下載下載次數:6465才學QT3,諸多不足,希望大家指導.
做這個花了一天時間...
歌曲名中,不可以包含 "."  ,"("  , ")"等符號,否則系統會報錯..

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

下面為自己實際操作時,一些截圖。可參考上面的文字對照理解。

編譯ARM版本的QT phonon動態庫檔案