VideoPlayer.cpp 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. #include "VideoPlayer.h"
  2. #include "AutoConnect.h"
  3. #include "Utility.h"
  4. #include "MultimediaPersistent.h"
  5. #include "UserInterfaceUtility.h"
  6. #include "ark_api.h"
  7. #include <QTimer>
  8. #include <QList>
  9. #include <QFileInfo>
  10. #include <QDomDocument>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <fcntl.h>
  14. #include <unistd.h>
  15. /*
  16. *功能:获取当前的播放模式
  17. */
  18. int getCrrentvideoPlayMode()
  19. {
  20. QFile file("/etc/videoplaymode");
  21. if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
  22. {
  23. qDebug()<<Q_FUNC_INFO<<"file :/etc/videoplaymode is open failed";
  24. }
  25. QTextStream in(&file);
  26. QString line = in.readLine();
  27. qDebug() << Q_FUNC_INFO<<"current video mode ="<<line.toInt();
  28. file.flush();
  29. file.close();
  30. if(line.isEmpty()){
  31. return 0;
  32. }
  33. return line.toInt();
  34. }
  35. class VideoPlayerPrivate
  36. {
  37. Q_DISABLE_COPY(VideoPlayerPrivate)
  38. public:
  39. enum CommandType {
  40. CT_Undefine = -1,
  41. CT_PlayIndex = 0,
  42. CT_PlayNext = 1,
  43. CT_PlayPrevious = 2,
  44. CT_Pause = 3,
  45. CT_Seek = 4,
  46. CT_Toggle = 5,
  47. };
  48. explicit VideoPlayerPrivate(VideoPlayer *parent);
  49. ~VideoPlayerPrivate();
  50. void initialize();
  51. void connectAllSlots();
  52. void playVideoIndex(const DeviceWatcherType type, const int index, const int x, const int y, const int width, const int height, const int millesimal);
  53. void setPlayMode(const VideoPlayerPlayMode mode);
  54. void setPlayStatus(const VideoPlayerPlayStatus status);
  55. void pauseToggleHandler(const QString& output);
  56. void startHandler(const QString& output);
  57. void endTimePositionHandler(const QString &output);
  58. void millesimalHandler(const QString& output);
  59. void timePositionHandler(const QString &output);
  60. QList<QString>& getPathList(const DeviceWatcherType type);
  61. void endOfFileHandler();
  62. void unsupportHandler();
  63. void undragAndDropHandler();//add by wandz 20190425
  64. void seekToMillesimal(const int millesimal);
  65. void createSDFileNamesXml();
  66. void createUSBFileNamesXml();
  67. void videoPlayerSetPlay();
  68. void videoPlayerSetSuspend();
  69. void videoPlayerSetPause();
  70. void videoPlayerSetExit(const DeviceWatcherType type);
  71. void exitVideoPlayer();
  72. void videoPlayerVisible(const bool flag);
  73. VideoPlayerPlayMode m_PlayMode;
  74. VideoPlayerPlayStatus m_PlayStatus;
  75. QString m_SDFileNamesXml;
  76. QString m_USBFileNamesXml;
  77. QList<QString> m_SDPathList;
  78. QList<QString> m_USBPathList;
  79. QProcess* m_VideoPlayer;
  80. DeviceWatcherType m_DiskType;
  81. int m_PlayIndex;
  82. int m_ElapsedTime;
  83. int m_Millesimal;
  84. int m_EndTime;
  85. int m_X;
  86. int m_Y;
  87. int m_Width;
  88. int m_Height;
  89. bool m_Suspend;
  90. QTimer* m_Timer;
  91. VideoPlayerPrivate::CommandType m_LastCommand;
  92. VideoPlayer *m_Parent;
  93. };
  94. void VideoPlayer::videoPlayerRequestFileNames(const DeviceWatcherType type)
  95. {
  96. switch (type) {
  97. case DWT_SDDisk: {
  98. emit onVideoPlayerFileNames(DWT_SDDisk, m_Private->m_SDFileNamesXml);
  99. break;
  100. }
  101. case DWT_USBDisk: {
  102. emit onVideoPlayerFileNames(DWT_USBDisk, m_Private->m_USBFileNamesXml);
  103. break;
  104. }
  105. default: {
  106. break;
  107. }
  108. }
  109. }
  110. void VideoPlayer::videoPlayerSetPlayModeToggle()
  111. {
  112. switch (m_Private->m_PlayMode) {
  113. case VPPM_AllRepeat: {
  114. videoPlayerSetPlayMode(VPPM_Shuffle);
  115. break;
  116. }
  117. case VPPM_Shuffle: {
  118. videoPlayerSetPlayMode(VPPM_RepeatOnce);
  119. break;
  120. }
  121. case VPPM_RepeatOnce:
  122. default: {
  123. videoPlayerSetPlayMode(VPPM_AllRepeat);
  124. break;
  125. }
  126. }
  127. }
  128. void VideoPlayer::videoPlayerSetPlayMode(const VideoPlayerPlayMode mode)
  129. {
  130. m_Private->setPlayMode(mode);
  131. }
  132. void VideoPlayer::videoPlayerSetPlayStatusToggle()
  133. {
  134. switch (m_Private->m_PlayStatus) {
  135. case VPPS_Play: {
  136. videoPlayerSetPlayStatus(VPPS_Pause);
  137. break;
  138. }
  139. case VPPS_Pause: {
  140. videoPlayerSetPlayStatus(VPPS_Play);
  141. break;
  142. }
  143. case VPPS_Stop: {
  144. videoPlayerSetPlayStatus(VPPS_Stop);
  145. }
  146. case VPPS_Unsupport: {
  147. m_Private->m_Timer->stop();
  148. m_Private->playVideoIndex(m_Private->m_DiskType, m_Private->m_PlayIndex, m_Private->m_X, m_Private->m_Y, m_Private->m_Width, m_Private->m_Height, 0);
  149. break;
  150. }
  151. default: {
  152. break;
  153. }
  154. }
  155. }
  156. void VideoPlayer::videoPlayerSetPlayStatus(const VideoPlayerPlayStatus status)
  157. {
  158. if (QProcess::Running == m_Private->m_VideoPlayer->state()) {
  159. if (VideoPlayerPrivate::CT_Undefine == m_Private->m_LastCommand) {
  160. m_Private->m_Timer->stop();
  161. switch (status) {
  162. case VPPS_Play: {
  163. m_Private->videoPlayerSetPlay();
  164. break;
  165. }
  166. case VPPS_Pause: {
  167. m_Private->videoPlayerSetPause();
  168. break;
  169. }
  170. case VPPS_SuspendToggle: {
  171. m_Private->videoPlayerSetSuspend();
  172. break;
  173. }
  174. case VPPS_Stop: {
  175. videoPlayerPlayListViewIndex(m_Private->m_DiskType, m_Private->m_PlayIndex, m_Private->m_X, m_Private->m_Y, m_Private->m_Width, m_Private->m_Height, 0);
  176. break;
  177. }
  178. default : {
  179. break;
  180. }
  181. }
  182. }
  183. }
  184. }
  185. void VideoPlayer::videoPlayerPlayListViewIndex(const DeviceWatcherType type, const int index, const int x, const int y, const int width, const int height, const int millesimal)
  186. {
  187. if (VideoPlayerPrivate::CT_Undefine == m_Private->m_LastCommand) {
  188. m_Private->m_Timer->stop();
  189. m_Private->playVideoIndex(type, index, x, y, width, height, millesimal);
  190. }
  191. }
  192. void VideoPlayer::videoPlayerPlayPreviousListViewIndex()
  193. {
  194. if (VideoPlayerPrivate::CT_Undefine == m_Private->m_LastCommand) {
  195. m_Private->m_Timer->stop();
  196. int lastIndex;
  197. if (MPPM_Shuffle == m_Private->m_PlayMode) {
  198. lastIndex = qrand() % m_Private->getPathList(m_Private->m_DiskType).size();
  199. } else {
  200. lastIndex = m_Private->m_PlayIndex;
  201. QList<QString> temp = m_Private->getPathList(m_Private->m_DiskType);
  202. if ((lastIndex > 0)
  203. && (lastIndex <= temp.size() - 1)) {
  204. --lastIndex;
  205. } else {
  206. lastIndex = temp.size() - 1;
  207. }
  208. }
  209. videoPlayerPlayListViewIndex(m_Private->m_DiskType, lastIndex, m_Private->m_X, m_Private->m_Y, m_Private->m_Width, m_Private->m_Height, 0);
  210. }
  211. }
  212. void VideoPlayer::videoPlayerPlayNextListViewIndex()
  213. {
  214. if (VideoPlayerPrivate::CT_Undefine == m_Private->m_LastCommand) {
  215. m_Private->m_Timer->stop();
  216. int lastIndex;
  217. if (MPPM_Shuffle == m_Private->m_PlayMode) {
  218. lastIndex = qrand() % m_Private->getPathList(m_Private->m_DiskType).size();
  219. } else {
  220. lastIndex = m_Private->m_PlayIndex;
  221. QList<QString> temp = m_Private->getPathList(m_Private->m_DiskType);
  222. if (((lastIndex < (temp.size() - 1)))
  223. && (lastIndex >= 0)) {
  224. ++lastIndex;
  225. } else {
  226. lastIndex = 0;
  227. }
  228. }
  229. videoPlayerPlayListViewIndex(m_Private->m_DiskType, lastIndex, m_Private->m_X, m_Private->m_Y, m_Private->m_Width, m_Private->m_Height, 0);
  230. }
  231. }
  232. void VideoPlayer::videoPlayerSeekToMillesimal(const int millesimal)
  233. {
  234. if (QProcess::Running == m_Private->m_VideoPlayer->state()) {
  235. if (VideoPlayerPrivate::CT_Undefine == m_Private->m_LastCommand) {
  236. m_Private->m_Timer->stop();
  237. m_Private->seekToMillesimal(millesimal);
  238. }
  239. }
  240. }
  241. void VideoPlayer::videoPlayerExit()
  242. {
  243. m_Private->videoPlayerSetExit(m_Private->m_DiskType);
  244. }
  245. void VideoPlayer::videoPlayerVisible(const bool flag)
  246. {
  247. if (QProcess::Running == m_Private->m_VideoPlayer->state()) {
  248. m_Private->videoPlayerVisible(flag);
  249. }
  250. }
  251. void VideoPlayer::onDeviceWatcherStatus(const DeviceWatcherType type, const DeviceWatcherStatus status)
  252. {
  253. if (DWT_SDDisk == type) {
  254. switch (status) {
  255. case DWS_Empty: {
  256. m_Private->m_SDPathList.clear();
  257. break;
  258. }
  259. case DWS_Busy: {
  260. m_Private->m_SDPathList.clear();
  261. break;
  262. }
  263. case DWS_Ready: {
  264. m_Private->createSDFileNamesXml();
  265. videoPlayerRequestFileNames(DWT_SDDisk);
  266. break;
  267. }
  268. case DWS_Remove: {
  269. m_Private->m_SDPathList.clear();
  270. if (DWT_SDDisk == m_Private->m_DiskType) {
  271. if (QProcess::NotRunning != m_Private->m_VideoPlayer->state()) {
  272. m_Private->m_VideoPlayer->write("pausing_keep_force quit\n");
  273. m_Private->m_VideoPlayer->waitForBytesWritten();
  274. m_Private->m_VideoPlayer->waitForFinished();
  275. QElapsedTimer time;
  276. time.start();
  277. while (time.elapsed() <= 500) {
  278. if (m_Private->m_VideoPlayer->canReadLine()) {
  279. QString output = m_Private->m_VideoPlayer->readLine();
  280. if (output.contains(QString("Exiting... (Quit)"))) {
  281. break;
  282. } else {
  283. quitHanlder(output);
  284. }
  285. } else {
  286. usleep(1 * 1000);
  287. }
  288. }
  289. }
  290. m_Private->m_PlayStatus = VPPS_Exit;
  291. }
  292. break;
  293. }
  294. default : {
  295. break;
  296. }
  297. }
  298. } else if (DWT_USBDisk == type) {
  299. switch (status) {
  300. case DWS_Empty: {
  301. m_Private->m_USBPathList.clear();
  302. break;
  303. }
  304. case DWS_Busy: {
  305. m_Private->m_USBPathList.clear();
  306. break;
  307. }
  308. case DWS_Ready: {
  309. m_Private->createUSBFileNamesXml();
  310. videoPlayerRequestFileNames(DWT_USBDisk);
  311. break;
  312. }
  313. case DWS_Remove: {
  314. m_Private->m_USBPathList.clear();
  315. if (DWT_USBDisk == m_Private->m_DiskType) {
  316. if (QProcess::NotRunning != m_Private->m_VideoPlayer->state()) {
  317. m_Private->m_VideoPlayer->write("pausing_keep_force quit\n");
  318. m_Private->m_VideoPlayer->waitForBytesWritten();
  319. m_Private->m_VideoPlayer->waitForFinished();
  320. QElapsedTimer time;
  321. time.start();
  322. while (time.elapsed() <= 500) {
  323. if (m_Private->m_VideoPlayer->canReadLine()) {
  324. QString output = m_Private->m_VideoPlayer->readLine();
  325. if (output.contains(QString("Exiting... (Quit)"))) {
  326. break;
  327. } else {
  328. m_Private->m_Parent->quitHanlder(output);
  329. }
  330. } else {
  331. usleep(1 * 1000);
  332. }
  333. }
  334. }
  335. m_Private->m_PlayStatus = VPPS_Exit;
  336. }
  337. }
  338. default : {
  339. break;
  340. }
  341. }
  342. }
  343. }
  344. void VideoPlayer::onVideoFilePath(const QString &path, const DeviceWatcherType type)
  345. {
  346. if (type == DWT_USBDisk) {
  347. m_Private->m_USBPathList.append(path);
  348. } else if (type == DWT_SDDisk) {
  349. m_Private->m_SDPathList.append(path);
  350. }
  351. // emit onVideoPlayerFilePath(type, path);
  352. }
  353. void VideoPlayer::onTimeout()
  354. {
  355. m_Private->endOfFileHandler();
  356. }
  357. void VideoPlayer::onReadyReadStandardOutput()
  358. {
  359. while (m_Private->m_VideoPlayer->canReadLine()) {
  360. quitHanlder(m_Private->m_VideoPlayer->readLine());
  361. }
  362. }
  363. void VideoPlayer::onReadyReadStandardError()
  364. {
  365. qWarning() << __PRETTY_FUNCTION__;
  366. while (m_Private->m_VideoPlayer->canReadLine()) {
  367. QString output(m_Private->m_VideoPlayer->readLine());
  368. qWarning() << __PRETTY_FUNCTION__ << output;
  369. }
  370. }
  371. void VideoPlayer::onStarted()
  372. {
  373. qWarning() << "VideoPlayer::onStarted" << m_Private->m_VideoPlayer->state();
  374. }
  375. void VideoPlayer::onFinished(int exitCode, QProcess::ExitStatus exitStatus)
  376. {
  377. qWarning() << "VideoPlayer::onFinished" << exitCode << exitStatus;
  378. }
  379. void VideoPlayer::onError(QProcess::ProcessError error)
  380. {
  381. qWarning() << "VideoPlayer::onError" << error << m_Private->m_VideoPlayer->error();
  382. }
  383. void VideoPlayer::onStateChanged(QProcess::ProcessState state)
  384. {
  385. qWarning() << "VideoPlayer::onStateChanged" << state;
  386. }
  387. VideoPlayer::VideoPlayer(QObject *parent)
  388. : QObject(parent)
  389. , m_Private(new VideoPlayerPrivate(this))
  390. {
  391. }
  392. VideoPlayer::~VideoPlayer()
  393. {
  394. }
  395. void VideoPlayer::quitHanlder(const QString &output)
  396. {
  397. //qDebug()<<"=== mplayer video:"<<output;
  398. if (output.contains(QString("ANS_LENGTH="))) {
  399. m_Private->endTimePositionHandler(output);
  400. } else if (output.contains(QString("ANS_PERCENT_POSITION="))) {
  401. m_Private->millesimalHandler(output);
  402. } else if (output.contains(QString("ANS_TIME_POSITION="))) {
  403. m_Private->timePositionHandler(output);
  404. } else if (output.contains(QString("ANS_pause"))) {
  405. m_Private->pauseToggleHandler(output);
  406. } else if (output.contains(QString("EOF code: 1"))) {
  407. m_Private->setPlayStatus(VPPS_Stop);
  408. m_Private->m_Timer->start();
  409. } else if (output.contains(QString("give up video"))) {
  410. onVideoPlayerVisible(false);
  411. } else if (output.contains(QString("take video"))) {
  412. onVideoPlayerVisible(true);
  413. } else if(output.contains(QString("Cannot seek in this file"))){
  414. qDebug()<<__PRETTY_FUNCTION__<<__LINE__<<"seek failed";
  415. emit onSliderTouchEnable(false); //dll add 不可拖动的视频禁止拖动
  416. m_Private->undragAndDropHandler();
  417. }else if ((output.contains(QString("incorrect streams")))//wandz video
  418. || (output.contains(QString("No stream found")))
  419. || (output.contains(QString("Cannot find codec matching selected -vo and video format")))
  420. || (output.contains(QString("Maybe you are playing a non-interleaved stream/file or the codec failed")))
  421. ) {
  422. m_Private->unsupportHandler();
  423. }/* else if (output.contains(QString("seek-begin"))) {
  424. } */else if ((output.contains(QString("seek-finish"))
  425. || (output.contains(QString("seek-error"))))) {
  426. emit onVideoPlayerPlayStatus(m_Private->m_DiskType, VPPS_SeekFinish);
  427. }
  428. else if((output.contains(QString("Exiting... (Fatal error)"))))
  429. {
  430. emit onVideoPlayerPlayStatus(m_Private->m_DiskType,VPPS_PlayError);
  431. }
  432. else {
  433. if (output != QString("\n")) {
  434. qDebug() << "output" << output;
  435. }
  436. }
  437. }
  438. VideoPlayerPrivate::VideoPlayerPrivate(VideoPlayer *parent)
  439. : m_Parent(parent)
  440. {
  441. // m_PlayMode = VPPM_AllRepeat;
  442. m_PlayMode = getCrrentvideoPlayMode();
  443. m_PlayStatus = VPPS_Exit;
  444. m_VideoPlayer = NULL;
  445. m_DiskType = DWT_Undefine;
  446. m_PlayIndex = -1;
  447. m_ElapsedTime = -1;
  448. m_Millesimal = 0;
  449. m_EndTime = -1;
  450. m_X = 0;
  451. m_Y = 0;
  452. m_Width = 800;
  453. m_Height = 480;
  454. m_Suspend = false;
  455. m_Timer = NULL;
  456. m_LastCommand = VideoPlayerPrivate::CT_Undefine;
  457. initialize();
  458. connectAllSlots();
  459. }
  460. VideoPlayerPrivate::~VideoPlayerPrivate()
  461. {
  462. if (QProcess::NotRunning != m_VideoPlayer->state()) {
  463. m_VideoPlayer->write("pausing_keep_force quit\n");
  464. m_VideoPlayer->waitForBytesWritten();
  465. m_VideoPlayer->waitForFinished();
  466. QElapsedTimer time;
  467. time.start();
  468. while (time.elapsed() <= 500) {
  469. if (m_VideoPlayer->canReadLine()) {
  470. QString output = m_VideoPlayer->readLine();
  471. if (output.contains(QString("Exiting... (Quit)"))) {
  472. break;
  473. } else {
  474. m_Parent->quitHanlder(output);
  475. }
  476. } else {
  477. usleep(1 * 1000);
  478. }
  479. }
  480. }
  481. }
  482. void VideoPlayerPrivate::initialize()
  483. {
  484. m_VideoPlayer = new QProcess(m_Parent);
  485. m_VideoPlayer->setProcessChannelMode(QProcess::MergedChannels);
  486. m_Timer = new QTimer(m_Parent);
  487. m_Timer->setSingleShot(true);
  488. m_Timer->setInterval(2000);
  489. }
  490. void VideoPlayerPrivate::connectAllSlots()
  491. {
  492. connectSignalAndSlotByNamesake(g_DeviceWatcher, m_Parent, SLOT(onDeviceWatcherStatus(const int, const int)));
  493. connectSignalAndSlotByNamesake(g_DeviceWatcher, m_Parent, SLOT(onVideoFilePath(const QString &, const int)));
  494. Qt::ConnectionType type = static_cast<Qt::ConnectionType>(Qt::UniqueConnection | Qt::AutoConnection);
  495. QObject::connect(m_VideoPlayer, SIGNAL(started()),
  496. m_Parent, SLOT(onStarted()),
  497. type);
  498. QObject::connect(m_VideoPlayer, SIGNAL(finished(int, QProcess::ExitStatus)),
  499. m_Parent, SLOT(onFinished(int, QProcess::ExitStatus)),
  500. type);
  501. QObject::connect(m_VideoPlayer, SIGNAL(error(QProcess::ProcessError)),
  502. m_Parent, SLOT(onError(QProcess::ProcessError)),
  503. type);
  504. QObject::connect(m_VideoPlayer, SIGNAL(stateChanged(QProcess::ProcessState)),
  505. m_Parent, SLOT(onStateChanged(QProcess::ProcessState)),
  506. type);
  507. QObject::connect(m_VideoPlayer, SIGNAL(readyReadStandardOutput()),
  508. m_Parent, SLOT(onReadyReadStandardOutput()),
  509. type);
  510. QObject::connect(m_VideoPlayer, SIGNAL(readyReadStandardError()),
  511. m_Parent, SLOT(onReadyReadStandardError()),
  512. type);
  513. QObject::connect(m_Timer, SIGNAL(timeout()),
  514. m_Parent, SLOT(onTimeout()),
  515. type);
  516. }
  517. void VideoPlayerPrivate::playVideoIndex(const DeviceWatcherType type, const int index, const int x, const int y, const int width, const int height, const int millesimal)
  518. {
  519. QList<QString> temp = getPathList(type);
  520. if ((VideoPlayerPrivate::CT_Undefine == m_LastCommand)
  521. && (temp.size() > index)
  522. && (QFile(temp.at(index))).exists()) {
  523. m_DiskType = type;
  524. m_ElapsedTime = 0;
  525. m_EndTime = 0;
  526. m_PlayIndex = index;
  527. m_Suspend = false;
  528. m_Millesimal = millesimal;
  529. m_X = x;
  530. m_Y = y;
  531. m_Width = width;
  532. m_Height = height;
  533. if (0 != millesimal) {
  534. if (QProcess::NotRunning != m_VideoPlayer->state()) {
  535. m_VideoPlayer->write("pausing_keep_force quit\n");
  536. m_VideoPlayer->waitForBytesWritten();
  537. m_VideoPlayer->waitForFinished();
  538. }
  539. }
  540. if (QProcess::NotRunning == m_VideoPlayer->state()) {
  541. QString cmd = QString("mplayer");
  542. QStringList arguments;
  543. arguments << QString("-slave");
  544. arguments << QString("-idle");
  545. arguments << QString("-quiet");
  546. arguments << QString("-geometry");
  547. arguments << QString(QString::number(m_Width)
  548. + QString("x")
  549. + QString::number(m_Height)
  550. + QString("+")
  551. + QString::number(m_X)
  552. + QString("+")
  553. + QString::number(m_Y));
  554. // arguments << QString("-aspect_ratio");//modify by wandz at20200609
  555. // arguments << QString("5");
  556. arguments << QString("-vo");
  557. arguments << QString("customfb");
  558. arguments << QString("-ao");
  559. arguments << QString("alsa");
  560. // arguments << QString("-debug");//print mplayer debug log but it will slow down
  561. // arguments << QString("-cache");
  562. // arguments << QString("8192");
  563. // arguments << QString("-lavdopts");
  564. // arguments << QString("threads=4");
  565. if (0 != millesimal) {
  566. arguments << QString("-ss");
  567. arguments << QString::number(millesimal);
  568. }
  569. usleep(250*1000);
  570. m_VideoPlayer->start(cmd, arguments);
  571. m_VideoPlayer->waitForStarted();
  572. }
  573. //切換视频时解开进度条拖动..防止不可拖动的视频也能拖动
  574. emit m_Parent->onSliderTouchEnable(true);
  575. QString cmd1 = QString("loadfile \"") + temp.at(m_PlayIndex) + QString("\"\n");
  576. m_VideoPlayer->write(cmd1.toLocal8Bit().constData());
  577. m_VideoPlayer->waitForBytesWritten();
  578. emit m_Parent->onVideoPlayerElapsedInformation(m_ElapsedTime, m_Millesimal);
  579. emit m_Parent->onVideoPlayerInformation(m_DiskType, m_PlayIndex, QFileInfo(temp.at(m_PlayIndex)).fileName(), m_EndTime);
  580. emit m_Parent->onVideoPlayerPlayMode(m_PlayMode);
  581. setPlayStatus(VPPS_Start);
  582. QFileInfo fileInfo(temp.at(m_PlayIndex));
  583. MultimediaPersistent::setVideoPathInfo(m_DiskType, fileInfo.filePath() + QString("/") + fileInfo.created().toString(QString("yyyyMMddhhmmss")) + fileInfo.lastModified().toString(QString("yyyyMMddhhmmss")) + QString::number(fileInfo.size()));
  584. MultimediaPersistent::setMultimediaType(m_DiskType, MT_Video);
  585. MultimediaPersistent::setVideoMillesmial(m_DiskType, millesimal);
  586. }
  587. }
  588. void VideoPlayerPrivate::setPlayMode(const VideoPlayerPlayMode mode)
  589. {
  590. if (mode != m_PlayMode) {
  591. m_PlayMode = mode;
  592. }
  593. emit m_Parent->onVideoPlayerPlayMode(m_PlayMode);
  594. }
  595. void VideoPlayerPrivate::setPlayStatus(const VideoPlayerPlayStatus status)
  596. {
  597. if (status != m_PlayStatus) {
  598. m_PlayStatus = status;
  599. }
  600. emit m_Parent->onVideoPlayerPlayStatus(m_DiskType, status);
  601. }
  602. void VideoPlayerPrivate::pauseToggleHandler(const QString &output)
  603. {
  604. if (output.contains(QString("yes"))) {
  605. setPlayStatus(VPPS_Pause);
  606. } else if (output.contains(QString("no"))) {
  607. setPlayStatus(VPPS_Play);
  608. if (VideoPlayerPrivate::CT_Seek == m_LastCommand) {
  609. }
  610. }
  611. }
  612. void VideoPlayerPrivate::startHandler(const QString &output)
  613. {
  614. }
  615. void VideoPlayerPrivate::endTimePositionHandler(const QString &output)
  616. {
  617. QString keyWord("ANS_LENGTH=");
  618. int startPos = output.indexOf(keyWord);
  619. int length = keyWord.length();
  620. QString endTime;
  621. endTime.clear();
  622. QList<QString> temp = getPathList(m_DiskType);
  623. if (temp.size() > m_PlayIndex) {
  624. m_EndTime = 0;
  625. if (-1 != startPos) {
  626. for (int i = 0; i < (output.length() - startPos); ++i) {
  627. if (QChar('\n') == output.at(startPos + length + i)) {
  628. m_EndTime = static_cast<int>(endTime.toFloat());
  629. break;
  630. }
  631. endTime += output.at(startPos + length + i);
  632. }
  633. }
  634. emit m_Parent->onVideoPlayerInformation(m_DiskType, m_PlayIndex, QFileInfo(temp.at(m_PlayIndex)).fileName(), m_EndTime);
  635. setPlayStatus(VPPS_Play);
  636. } else {
  637. qCritical() << temp.size() << m_PlayIndex;
  638. }
  639. }
  640. void VideoPlayerPrivate::millesimalHandler(const QString &output)
  641. {
  642. int start = output.indexOf(QChar('=')) + 1;
  643. int end = output.indexOf(QChar('\n'));
  644. if ((-1 != start)
  645. && (-1 != end)) {
  646. bool ok(false);
  647. int millesimal = static_cast<int>(output.mid(start, end - start).toFloat(&ok) * 1000);
  648. if (ok) {
  649. m_Millesimal = millesimal;
  650. }
  651. }
  652. }
  653. void VideoPlayerPrivate::timePositionHandler(const QString &output)
  654. {
  655. if (output.startsWith(QString("ANS_TIME_POSITION="), Qt::CaseSensitive)) {
  656. int start = output.indexOf(QChar('=')) + 1;
  657. int end = output.indexOf(QChar('\n'));
  658. if ((-1 != start)
  659. && (-1 != end)) {
  660. bool ok = true;
  661. int elapsed = output.mid(start, end - start).toInt(&ok);
  662. if (ok) {
  663. if (((qAbs(m_ElapsedTime - elapsed) > 5))
  664. || (elapsed % 5)) {
  665. MultimediaPersistent::setVideoMillesmial(m_DiskType, elapsed);
  666. }
  667. m_ElapsedTime = elapsed;
  668. emit m_Parent->onVideoPlayerElapsedInformation(m_ElapsedTime, m_Millesimal);
  669. }
  670. }
  671. }
  672. }
  673. QList<QString> &VideoPlayerPrivate::getPathList(const int type)
  674. {
  675. switch (type) {
  676. case DWT_SDDisk: {
  677. return m_SDPathList;
  678. break;
  679. }
  680. case DWT_USBDisk:
  681. default: {
  682. return m_USBPathList;
  683. break;
  684. }
  685. }
  686. }
  687. void VideoPlayerPrivate::endOfFileHandler()
  688. {
  689. switch (m_PlayStatus) {
  690. case VPPS_Start:
  691. case VPPS_Unsupport:
  692. case VPPS_Pause:
  693. case VPPS_Stop:
  694. case VPPS_Play: {
  695. switch (m_PlayMode) {
  696. case VPPM_AllRepeat: {
  697. if ((getPathList(m_DiskType).size() - 1) > m_PlayIndex) {
  698. ++m_PlayIndex;
  699. } else {
  700. m_PlayIndex = 0;
  701. }
  702. break;
  703. }
  704. case VPPM_RepeatOnce: {
  705. break;
  706. }
  707. case VPPM_Shuffle:
  708. default : {
  709. m_PlayIndex = qrand() % getPathList(m_DiskType).size();
  710. break;
  711. }
  712. }
  713. playVideoIndex(m_DiskType, m_PlayIndex, m_X, m_Y, m_Width, m_Height, 0);
  714. break;
  715. }
  716. default: {
  717. break;
  718. }
  719. }
  720. }
  721. void VideoPlayerPrivate::unsupportHandler()
  722. {
  723. QList<QString> temp = getPathList(m_DiskType);
  724. if (m_PlayIndex < temp.size()) {
  725. m_ElapsedTime = 0;
  726. m_Millesimal = 0;
  727. emit m_Parent->onVideoPlayerElapsedInformation(m_ElapsedTime, m_Millesimal);
  728. m_EndTime = 0;
  729. emit m_Parent->onVideoPlayerInformation(m_DiskType, m_PlayIndex, QFileInfo(temp.at(m_PlayIndex)).fileName(), m_EndTime);
  730. setPlayStatus(VPPS_Unsupport);
  731. m_Timer->start();
  732. }
  733. }
  734. //handler for can't drag and drop for video,from wandz at 20190425
  735. void VideoPlayerPrivate::undragAndDropHandler()
  736. {
  737. setPlayStatus(VPPS_UndragAndDrop);
  738. }
  739. void VideoPlayerPrivate::seekToMillesimal(const int millesimal)
  740. {
  741. if ((VPPS_Pause == m_PlayStatus)
  742. || (VPPS_Play == m_PlayStatus)) {
  743. QString cmd("seek %1.%2 1\n");
  744. cmd = cmd.arg(millesimal / 10, 3, 10, QChar(' ')).arg(millesimal % 10, 1, 10, QChar('0'));
  745. m_VideoPlayer->write(cmd.toLocal8Bit().constData());
  746. m_VideoPlayer->waitForBytesWritten();
  747. } else {
  748. playVideoIndex(m_DiskType, m_PlayIndex, m_X, m_Y, m_Width, m_Height, 0);
  749. }
  750. }
  751. void VideoPlayerPrivate::createSDFileNamesXml()
  752. {
  753. QDomDocument domDocument;
  754. domDocument.clear();
  755. domDocument.appendChild(domDocument.createElement(QString("VideoPlayer")));
  756. QDomElement root = domDocument.firstChildElement(QString("VideoPlayer"));
  757. QDomElement fileNames;
  758. QDomElement info;
  759. fileNames = domDocument.createElement(QString("SDFileNames"));
  760. root.appendChild(fileNames);
  761. m_SDFileNamesXml.clear();
  762. QString sdPersistantPathInfo = MultimediaPersistent::getVideoPathInfo(DWT_SDDisk);
  763. QStringList stringList = sdPersistantPathInfo.split(QChar('/'));
  764. QString sdPersistantPath = sdPersistantPathInfo.left(sdPersistantPathInfo.length() - stringList.last().length() - 1);
  765. QString persistantIndex("");
  766. QFileInfo fileInfo;
  767. int i;
  768. for (i = 0; i < m_SDPathList.size(); ++i) {
  769. info = domDocument.createElement(QString("Index:" + QString::number(i)));
  770. fileNames.appendChild(info);
  771. fileInfo.setFile(m_SDPathList.at(i));
  772. info.appendChild(domDocument.createTextNode(fileInfo.fileName()));
  773. if (persistantIndex.isEmpty()) {
  774. if (fileInfo.filePath() == sdPersistantPath) {
  775. if (sdPersistantPathInfo == (fileInfo.filePath() + QString("/") + fileInfo.created().toString(QString("yyyyMMddhhmmss")) + fileInfo.lastModified().toString(QString("yyyyMMddhhmmss")) + QString::number(fileInfo.size()))) {
  776. persistantIndex = QString::number(i);
  777. }
  778. }
  779. }
  780. }
  781. QDomElement persistant = domDocument.createElement(QString("SDPersistant"));
  782. root.appendChild(persistant);
  783. unsigned char multimediaType = MultimediaPersistent::getMultimediaType(DWT_SDDisk);
  784. int videoMillesmial = 0;
  785. if (persistantIndex.isEmpty()) {
  786. if (0 == i) {
  787. persistantIndex = QString("-1");
  788. multimediaType = MT_Idle;
  789. } else {
  790. if (0 == multimediaType) {
  791. multimediaType = MT_Video;
  792. MultimediaPersistent::setMultimediaType(DWT_SDDisk, multimediaType);
  793. }
  794. persistantIndex = QString("0");
  795. }
  796. } else {
  797. videoMillesmial = MultimediaPersistent::getVideoMillesmial(DWT_SDDisk);
  798. }
  799. QString data = persistantIndex + QString("-") + QString::number(videoMillesmial);
  800. qDebug()<<__PRETTY_FUNCTION__<<"line:"<<__LINE__<<"sd videoMillesmia"<<data;
  801. persistant.appendChild(domDocument.createTextNode(data));
  802. QDomElement type = domDocument.createElement(QString("SDType"));
  803. root.appendChild(type);
  804. type.appendChild(domDocument.createTextNode(QString::number(multimediaType)));
  805. m_SDFileNamesXml = domDocument.toString();
  806. }
  807. void VideoPlayerPrivate::createUSBFileNamesXml()
  808. {
  809. QDomDocument domDocument;
  810. domDocument.clear();
  811. domDocument.appendChild(domDocument.createElement(QString("VideoPlayer")));
  812. QDomElement root = domDocument.firstChildElement(QString("VideoPlayer"));
  813. QDomElement fileNames;
  814. QDomElement info;
  815. fileNames = domDocument.createElement(QString("USBFileNames"));
  816. root.appendChild(fileNames);
  817. m_USBFileNamesXml.clear();
  818. QString usbPersistantPathInfo = MultimediaPersistent::getVideoPathInfo(DWT_USBDisk);
  819. QStringList stringList = usbPersistantPathInfo.split(QChar('/'));
  820. QString usbPersistantPath = usbPersistantPathInfo.left(usbPersistantPathInfo.length() - stringList.last().length() - 1);
  821. QString persistantIndex("");
  822. QFileInfo fileInfo;
  823. int i;
  824. for (i = 0; i < m_USBPathList.size(); ++i) {
  825. info = domDocument.createElement(QString("Index:" + QString::number(i)));
  826. fileNames.appendChild(info);
  827. fileInfo.setFile(m_USBPathList.at(i));
  828. info.appendChild(domDocument.createTextNode(fileInfo.fileName()));
  829. if (persistantIndex.isEmpty()) {
  830. if (fileInfo.filePath() == usbPersistantPath) {
  831. if (usbPersistantPathInfo == (fileInfo.filePath() + QString("/") + fileInfo.created().toString(QString("yyyyMMddhhmmss")) + fileInfo.lastModified().toString(QString("yyyyMMddhhmmss")) + QString::number(fileInfo.size()))) {
  832. persistantIndex = QString::number(i);
  833. }
  834. }
  835. }
  836. }
  837. QDomElement persistant = domDocument.createElement(QString("USBPersistant"));
  838. root.appendChild(persistant);
  839. unsigned char multimediaType = MultimediaPersistent::getMultimediaType(DWT_USBDisk);
  840. int videoMillesmial = 0;
  841. if (persistantIndex.isEmpty()) {
  842. if (0 == i) {
  843. persistantIndex = QString("-1");
  844. multimediaType = MT_Idle;
  845. } else {
  846. if (0 == multimediaType) {
  847. multimediaType = MT_Video;
  848. MultimediaPersistent::setMultimediaType(DWT_USBDisk, multimediaType);
  849. }
  850. persistantIndex = QString("0");
  851. }
  852. } else {
  853. videoMillesmial = MultimediaPersistent::getVideoMillesmial(DWT_USBDisk);
  854. }
  855. QString data = persistantIndex + QString("-") + QString::number(videoMillesmial);
  856. qDebug()<<__PRETTY_FUNCTION__<<"line:"<<__LINE__<<"usb videoMillesmia"<<data;
  857. persistant.appendChild(domDocument.createTextNode(data));
  858. QDomElement type = domDocument.createElement(QString("USBType"));
  859. root.appendChild(type);
  860. type.appendChild(domDocument.createTextNode(QString::number(multimediaType)));
  861. m_USBFileNamesXml = domDocument.toString();
  862. }
  863. void VideoPlayerPrivate::videoPlayerSetPlay()
  864. {
  865. switch (m_PlayStatus) {
  866. case VPPS_Play: {
  867. break;
  868. }
  869. case VPPS_Pause: {
  870. m_VideoPlayer->write("u\n");
  871. m_VideoPlayer->waitForBytesWritten();
  872. break;
  873. }
  874. default: {
  875. return;
  876. break;
  877. }
  878. }
  879. }
  880. void VideoPlayerPrivate::videoPlayerSetSuspend()
  881. {
  882. if (m_Suspend) {
  883. m_Suspend = false;
  884. videoPlayerSetPlay();
  885. } else {
  886. if ((VPPS_Play == m_PlayStatus)
  887. || (VPPS_Start == m_PlayStatus)) {
  888. m_Suspend = true;
  889. videoPlayerSetPause();
  890. } else if (VPPS_Pause == m_PlayStatus) {
  891. m_VideoPlayer->write("pausing_keep_force pause\n");
  892. m_VideoPlayer->waitForBytesWritten();
  893. }
  894. }
  895. }
  896. void VideoPlayerPrivate::videoPlayerSetPause()
  897. {
  898. switch (m_PlayStatus) {
  899. case VPPS_Start:
  900. case VPPS_Play: {
  901. m_VideoPlayer->write("pausing_keep_force pause\n");
  902. m_VideoPlayer->waitForBytesWritten();
  903. break;
  904. }
  905. case VPPS_Pause: {
  906. break;
  907. }
  908. default: {
  909. return;
  910. break;
  911. }
  912. }
  913. }
  914. void VideoPlayerPrivate::videoPlayerSetExit(const DeviceWatcherType type)
  915. {
  916. if (type == m_DiskType) {
  917. exitVideoPlayer();
  918. }
  919. }
  920. void VideoPlayerPrivate::exitVideoPlayer()
  921. {
  922. if (QProcess::NotRunning != m_VideoPlayer->state()) {
  923. m_VideoPlayer->write("pausing_keep_force quit\n");
  924. m_VideoPlayer->waitForBytesWritten();
  925. m_VideoPlayer->waitForFinished();
  926. QElapsedTimer time;
  927. time.start();
  928. while (time.elapsed() <= 500) {
  929. if (m_VideoPlayer->canReadLine()) {
  930. QString output = m_VideoPlayer->readLine();
  931. if (output.contains(QString("Exiting... (Quit)"))) {
  932. break;
  933. } else {
  934. m_Parent->quitHanlder(output);
  935. }
  936. } else {
  937. usleep(1 * 1000);
  938. }
  939. }
  940. setPlayStatus(VPPS_Exit);
  941. }
  942. }
  943. void VideoPlayerPrivate::videoPlayerVisible(const bool flag)
  944. {
  945. if (QProcess::Running == m_VideoPlayer->state()) {
  946. if (flag) {
  947. m_VideoPlayer->write("pausing_keep_force takevideo\n");
  948. } else {
  949. m_VideoPlayer->write("pausing_keep_force giveupvideo\n");
  950. }
  951. m_VideoPlayer->waitForBytesWritten();
  952. }
  953. }