分享一个 Qt + FFMPEG + SDL 实现的视频播放器【申精】

雲天之巔 2013-03-08 11:27:12

前段日子为了实现视频监控所以研究了FFMPEG
后来出于兴趣在实现了视频监控之余本人写了这个视频播放器:

最近看到有人在用phonon时遇到的一些问题,比如如何提取一张图片,如何移植到arm
其实phonon底层还是直接调用的mplayer,所以本人不喜欢用phonon这玩意。
因此我用了ffmpeg来播放音视频。

播放器简介:
解码视频用的是: FFMPEG
显示用的是:Qt
播放声音用的是:SDL

这个非常适合学习ffmpeg的同胞

先看下效果:


这里并没有对播放界面进行任何美化,只是简单的实现显示的功能,反正都是Qt美化起来很简单了,
重点还是用ffmpeg实现的播放视频的引擎。
此播放器可以直接播放音频文件和视频文件,不过有个问题,就是在windows下mp3格式的文件没声音不知道是为什么,有大神知道原因么?

FFMPEG和SDL都是跨平台的,因此不会失去Qt跨平台的特性,我只给出了ffmpeg和sdl的windows版本的库
如果要在linux下运行 只需将库替换成Linux版本的即可。

代码地址:
http://download.csdn.net/detail/qq214517703/5122833


另外本播放器绝对原创,申请精华~
...全文
10287 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
雲天之巔 2015-09-16
  • 打赏
  • 举报
回复
建议大家别看这个了 这个用的ffmpeg版本是1.0 版本太低了 而且播放确实也存在问题。 看我上面给的那个吧。。
雲天之巔 2015-09-16
  • 打赏
  • 举报
回复
这个以前写的 那时候 对视频了解的不够透彻 这个播放有点问题 显示的话我觉得还是用SDL显示比较好,可以参考这个: http://blog.csdn.net/tanlon_0308/article/details/40428139 Qt+FFMPEG实现的视频播放器 可以看QtAv这个是官方写的: http://www.oschina.net/news/59684/qtav-1-5-0
  • 打赏
  • 举报
回复
出现无法打开“inttypes.h”文件,怎么回事
  • 打赏
  • 举报
回复
我编译出现c1083错误:无法打开包含文件“inttypes.h”:NO such file or directory怎么回事
qq_22652007 2015-06-15
  • 打赏
  • 举报
回复
博主,本人初学,想用ffpemag做个屏幕共享,该如何做呢
SmartSmall 2015-03-13
  • 打赏
  • 举报
回复
赞赞赞~~~~~学习ing
qyvlik 2015-03-01
  • 打赏
  • 举报
回复
播放mp4文件,速度奇慢
qyvlik 2015-02-13
  • 打赏
  • 举报
回复
这里先谢谢楼主了。 这里我简单的说说楼主播放器播放视频的思路,音频的话 ,我就没去看~ 首先先申请一个解码器的实例,通过ffmpeg来获取一个视频帧(也就是图片啦~),然后将这个视频帧以信号的方式连接到播放器的readOneFrame(QImage); 接着在主界面设置一个QLabel(好像是,可以设置图片)。 然后将播放器的readOneFrame(QImage)这个信号连接到主界面的一个slotgetFrame(QImage)这个槽函数,这个槽函数就通过设置QLabel的Pixmap来设置图片。 大致是这样的如下: ffmpeg获取视频帧,连接播放器的一个信号,这个信号携带这一个视频帧,接着这个携带视频帧的信号触发了一个槽函数,槽函数就通过这个信号携带的视频帧设置当前的图片,周而复始,达到播放视频的效果。 关于音频播放嘛~再研究研究
amos.yang 2014-10-23
  • 打赏
  • 举报
回复
很不错的东西,可惜mp4格式的视频不支持,不知道楼主有办法没有?
雲天之巔 2014-07-31
  • 打赏
  • 举报
回复
引用 22 楼 qq_16898317 的回复:
Starting C:\QT\VideoPlayerCord\build-VideoPlayer-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\VideoPlayer.exe... The program has unexpectedly finished. C:\QT\VideoPlayerCord\build-VideoPlayer-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\VideoPlayer.exe crashed
果断是你没有把相应的dll放在程序所在的目录,程序引用外部库的时候,通常会遇到这种问题,不知道是腰哪些库的话,最简答的方法就是直接双击exe文件 它会提示你缺少哪个dll
qq_16898317 2014-06-25
  • 打赏
  • 举报
回复
为什么我出现了这样的个错误 Starting C:\QT\VideoPlayerCord\build-VideoPlayer-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\VideoPlayer.exe... The program has unexpectedly finished. C:\QT\VideoPlayerCord\build-VideoPlayer-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\VideoPlayer.exe crashed
qq_16898317 2014-06-25
  • 打赏
  • 举报
回复
Starting C:\QT\VideoPlayerCord\build-VideoPlayer-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\VideoPlayer.exe... The program has unexpectedly finished. C:\QT\VideoPlayerCord\build-VideoPlayer-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\VideoPlayer.exe crashed
icewolf13 2014-04-15
  • 打赏
  • 举报
回复
编译过去了 工程文件中 LIBS += -L src/dll/SDL.dll //最好绝对路径 不明白这个工程用相对路径都是找不到dll 谢谢楼主~
icewolf13 2014-04-15
  • 打赏
  • 举报
回复
谢谢楼主分享 请教下为什么编译的时候会出现报错 debug/videoplayer.o: In function `Z17packet_queue_initP11PacketQueue': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:29: undefined reference to `SDL_CreateMutex' debug/videoplayer.o: In function `Z16packet_queue_putP11PacketQueueP8AVPacket': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:44: undefined reference to `SDL_mutexP' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:52: undefined reference to `SDL_mutexV' debug/videoplayer.o: In function `packet_queue_clear': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:58: undefined reference to `SDL_mutexP' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:69: undefined reference to `SDL_mutexV' debug/videoplayer.o: In function `packet_queue_get': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:76: undefined reference to `SDL_mutexP' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:93: undefined reference to `SDL_mutexV' debug/videoplayer.o: In function `Z14audio_callbackPvPhi': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:159: undefined reference to `SDL_MixAudio' debug/videoplayer.o: In function `ZN11DecodeVideo3runEv': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:197: undefined reference to `SDL_mutexP' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:199: undefined reference to `SDL_mutexV' debug/videoplayer.o: In function `ZN11VideoPlayerC2Ev': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:224: undefined reference to `SDL_CreateMutex' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:225: undefined reference to `SDL_CreateMutex' debug/videoplayer.o: In function `ZN11VideoPlayer7openSDLEv': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:367: undefined reference to `SDL_LockAudio' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:377: undefined reference to `SDL_OpenAudio' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:379: undefined reference to `SDL_GetError' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:382: undefined reference to `SDL_UnlockAudio' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:383: undefined reference to `SDL_PauseAudio' debug/videoplayer.o: In function `ZN11VideoPlayer8closeSDLEv': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:391: undefined reference to `SDL_LockAudio' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:392: undefined reference to `SDL_CloseAudio' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:393: undefined reference to `SDL_UnlockAudio' debug/videoplayer.o: In function `ZN11VideoPlayer10readPacketEv': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:404: undefined reference to `SDL_mutexP' E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:444: undefined reference to `SDL_mutexV' debug/videoplayer.o: In function `ZN11VideoPlayer4seekEx': E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:506: undefined reference to `SDL_mutexP' Makefile.Debug:84: recipe for target 'debug\VideoPlayer.exe' failed E:\QtProject\QtFFMPEG-SDL\src\511Debug/../VideoPlayer/videoplayer.cpp:529: undefined reference to `SDL_mutexV' collect2.exe: error: ld returned 1 exit status SDL_mutex.h等文件的路径都包含了啊 也能点击到函数定义 就是不能编译
mxl198869 2014-01-21
  • 打赏
  • 举报
回复
请问楼主如何处理在你做好的这个视频播放器基础上,tcp接收网络编码好的实时视频流,实时播放呢?
雲天之巔 2013-11-02
  • 打赏
  • 举报
回复
引用 7 楼 riveken 的回复:
我也遇到了3楼同样的问题,找不到 -lSDL.dll.a文件,是因为QT版本不对吗,我用的是4.8.4,请问楼主和3楼大侠是如何解决的呢,求赐教!!
应该是你shadows build开了。
雲天之巔 2013-11-02
  • 打赏
  • 举报
回复
引用 14 楼 carmen816 的回复:
首先感觉楼主分享! 1<你这么搞会导致多线程访问 avcodec_decode_video,这是不对的。 ffmpeg多线程解码是通过参数设置的。并不是所有的codec都支持多线程解码。 if (!decodeVideoThread->isRunning()) { decodeVideoThread->setPacket(nextPacket); decodeVideoThread->start(); } else if (!decodeVideoThread_2->isRunning()) { decodeVideoThread_2->setPacket(nextPacket); decodeVideoThread_2->start(); } else if (!decodeVideoThread_3->isRunning()) { decodeVideoThread_3->setPacket(nextPacket); decodeVideoThread_3->start(); } 2<你就没用SDL去贴图~~,直接用QT的,你这边的SDL,只是用于渲染音频。。。。这意义不大啊,兄弟。 connect(player,SIGNAL(readOneFrame(QImage)),this,SLOT(slotgetFrame(QImage))); void MainWindow::slotgetFrame(QImage image) { QPixmap pixmap = QPixmap::fromImage(image.scaled(ui->label->size(), Qt::KeepAspectRatio) ); ui->label->setPixmap(pixmap); } void DecodeVideo::run() { ..... emit readOneFrame(image); av_free_packet(&packet); } 3<Windows 平台播放不了mp3的问题 void VideoPlayer::readPacket() { if (pFormatCtx == NULL) return; SDL_LockMutex(mutex); currenttime+=10; if (currenttime >= nextPacket.dts) { 这处判定没在进入。 你播视频的时候,AVPacket的dts的单位是AVStream的time_base。比如mp3文件的time_base是1/14112000,而你这边currenttime的单位,估计是假设成1/1000。
1.主要是单线程编码很慢 特别是爆发RMVB的时候 我才出此下策 2.因为我是在不懂windows下要怎么播放音频 就用了SDL来播放了 3.感谢啊 我也发现了音频有些问题 可是不知道为啥。 还以为是库的问题 学习了。
雲天之巔 2013-11-02
  • 打赏
  • 举报
回复
引用 13 楼 hare777 的回复:
请教下楼主,如何用ffmpeg截取视频某一帧的图片,因为想要取得这帧数据后显示成缩略图
解码后不就是一帧图形么? 直接获取就是了。
neuredfox 2013-10-25
  • 打赏
  • 举报
回复
最近也在分析ffmpeg,先下载下来参考下,谢谢楼主啦。
carmen816 2013-10-23
  • 打赏
  • 举报
回复
首先感觉楼主分享!

1<你这么搞会导致多线程访问 avcodec_decode_video,这是不对的。
ffmpeg多线程解码是通过参数设置的。并不是所有的codec都支持多线程解码。
if (!decodeVideoThread->isRunning())
{
decodeVideoThread->setPacket(nextPacket);
decodeVideoThread->start();
}
else if (!decodeVideoThread_2->isRunning())
{
decodeVideoThread_2->setPacket(nextPacket);
decodeVideoThread_2->start();
}
else if (!decodeVideoThread_3->isRunning())
{
decodeVideoThread_3->setPacket(nextPacket);
decodeVideoThread_3->start();
}


2<你就没用SDL去贴图~~,直接用QT的,你这边的SDL,只是用于渲染音频。。。。这意义不大啊,兄弟。
connect(player,SIGNAL(readOneFrame(QImage)),this,SLOT(slotgetFrame(QImage)));
void MainWindow::slotgetFrame(QImage image)
{
QPixmap pixmap = QPixmap::fromImage(image.scaled(ui->label->size(), Qt::KeepAspectRatio) );
ui->label->setPixmap(pixmap);
}

void DecodeVideo::run()
{
.....
emit readOneFrame(image);

av_free_packet(&packet);
}

3<Windows 平台播放不了mp3的问题
void VideoPlayer::readPacket()
{
if (pFormatCtx == NULL) return;
SDL_LockMutex(mutex);
currenttime+=10;
if (currenttime >= nextPacket.dts)
{

这处判定没在进入。
你播视频的时候,AVPacket的dts的单位是AVStream的time_base。比如mp3文件的time_base是1/14112000,而你这边currenttime的单位,估计是假设成1/1000。
加载更多回复(13)

16,224

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧