Qt将B站m4s视频格式转换mp4
代码实现了自动遍历B站视频利用ffmpeg将m4s格式转换为mp4格式
链接: .
#include <QCoreApplication> #include <QTextStream> #include <QDir> #include <QJsonObject> #include <QJsonDocument> #include <QJsonParseError> #include <QProcess> #include <QThreadPool> class CusRunnable : public QRunnable { public: explicit CusRunnable(QString comman){ command = comman;} ~CusRunnable(){ } void run() { QProcess process; process.execute(command); process.waitForFinished(); } private: QString command; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTextStream out(stdout); QTextStream in(stdin); QString path; while (true) { out << QString::fromLocal8Bit("Please input m4s media path:") << Qt::flush; in >> path; QString commandCode; QDir dir = QDir(path); if(dir.exists()) { while (true) { out << QString::fromLocal8Bit("1 -> Start bilibili media merge 2 -> Reset path 3 -> Exit application Command:") << Qt::flush; in >> commandCode; int code = commandCode.toInt(); if(code == 1) { dir.setFilter(QDir::Dirs); dir.setSorting(QDir::Name); QFileInfoList list = dir.entryInfoList(); int i = 0; QThreadPool* pool = QThreadPool::globalInstance(); pool->setMaxThreadCount(10); pool->setExpiryTimeout(-1); do { QFileInfo fileInfo = list.at(i); if(fileInfo.fileName() == "." | fileInfo.fileName() == "..") { ++i; continue; } if(fileInfo.isDir()) { QFile file = QFile(fileInfo.filePath() + "/entry.json"); if(file.exists()) { file.open(QIODevice::ReadOnly); QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), &error); if(doc.isNull() || error.error == error.NoError) { QString targetName = doc.object().value("page_data").toObject().value("part").toString(); dir.mkdir("./output"); QString comman = "ffmpeg -i " + fileInfo.filePath() + "/64/video.m4s " "-i " + fileInfo.filePath() + "/64/audio.m4s " "-c:v copy -strict experimental "" + dir.path() +"/output/" + targetName + ".mp4""; CusRunnable * pWork = new CusRunnable(comman); pool->start(pWork); } file.close(); } } ++i; } while (i < list.size()); pool->waitForDone(); out << QString::fromLocal8Bit("Execute done ") << Qt::flush; break; } else if(code == 2) { break; } else if(code == 3) { return 0; } else { out << QString::fromLocal8Bit("Unknown Command ") << Qt::flush; } } } else { out << QString::fromLocal8Bit("Path does not exist ") << Qt::flush; } } return a.exec(); }
已添加多线程,此源码仅供学习使用。