当前位置: 首页 > news >正文

wordpress动态网页seo优化轻松seo优化排名

wordpress动态网页,seo优化轻松seo优化排名,重庆南川网站制作价格,做网站和推广硝酸银试剂盒文章目录 概要如何解密M3U8文件呢实现思路和代码序列图网络请求解密 结论 概要 视频文件很多已M3U8文件格式来提供,先复习下什么是M3U8文件!用QT的 mutimedia框架来播放视频时,有的视频加载慢,有的视频加载快,为啥&am…

文章目录

    • 概要
    • 如何解密M3U8文件呢
    • 实现思路和代码
      • 序列图
      • 网络请求
      • 解密
    • 结论

概要

视频文件很多已M3U8文件格式来提供,先复习下什么是M3U8文件!用QT的 mutimedia框架来播放视频时,有的视频加载慢,有的视频加载快,为啥?结论再最后

m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。但无论是哪种播放列表,其内部文字使用的都是 utf-8 编码。

当 m3u8 文件作为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。其格式如下所示:

#EXTM3U
#EXT-X-TARGETDURATION:10#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts

对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要 定时重新请求 该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。

当 m3u8 作为主播放列表(Master Playlist)时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Stream)。其格式如下所示:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://example.com/audio/index.m3u8

该备用流资源指定了多种不同码率,不同格式的媒体播放列表,并且,该备用流资源也可同时提供不同版本的资源内容,比如不同语言的音频文件,不同角度拍摄的视屏文件等等。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。

以上,就是 m3u8 文件的大概内容

如何解密M3U8文件呢

示例:

M3U8文件是一种播放列表文件,用于存储和组织HLS(HTTP Live Streaming)流媒体数据。在M3U8文件中,EXT-X-KEY、URI和IV等字段是用于描述流媒体的关键信息。

EXT-X-KEY: 这个字段用于指定加密密钥的信息。它通常包含一个URI,该URI指向包含密钥的媒体文件。该字段还可能包含其他参数,如密钥的加密算法和密码等。
URI: 这个字段指定了媒体文件的URL地址。它用于告诉播放器从哪个位置获取媒体数据。
IV: 这个字段是初始化向量(Initialization Vector)的缩写,用于加密算法的初始化过程。在HLS流媒体中,每个媒体片段都使用不同的初始化向量进行加密,以确保每个片段的加密是独立的。
这些字段通常以特定的格式出现在M3U8文件中。下面是一个示例:

#EXTM3U  
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1280000  
http://example.com/stream.m3u8?token=1234567890  
#EXT-X-KEY:METHOD=AES-128, URI="http://example.com/key.txt", IV=0x00000000000000000000000000000001  
#EXT-X-KEY:METHOD=AES-128, URI="http://example.com/key2.txt", IV=0x00000001000000010000000100000002  
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000, CODECS="mp4a.40.2", RESOLUTION=480x360, FRAME-RATE=15  
#EXTINF:16.733333,
http://example.com/iframe.m3u8?token=abcdefghijklmnopqrstuvwxyz

在上述示例中,#EXTM3U标识了文件为M3U8播放列表的开始。#EXT-X-STREAM-INF指定了流媒体的信息,如节目ID和带宽。http://example.com/stream.m3u8?token=1234567890是媒体文件的URI。接下来的#EXT-X-KEY字段指定了加密密钥的信息,包括加密方法和密钥的URI以及初始化向量(IV)。在这个例子中,有两个密钥,每个密钥对应一个媒体片段。最后,#EXT-X-I-FRAME-STREAM-INF指定了I帧媒体流的信息,包括节目ID、带宽、编解码器、分辨率和帧率等。http://example.com/iframe.m3u8?token=abcdefghijklmnopqrstuvwxyz是I帧媒体文件的URI。

实现思路和代码

序列图

在这里插入图片描述

网络请求

	QNetworkRequest request(url);  //请求m3u8地址request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");addAllCookie(request);QNetworkReply *pNetworkResponse = pManager->get(request);m_tsContent.clear();m_keyContent.clear();m_ivData.clear();QObject::connect(pNetworkResponse, &QNetworkReply::finished, [=]{if (pNetworkResponse->error() == QNetworkReply::NoError){QByteArray bytes = pNetworkResponse->readAll();QJsonObject json_object = QJsonDocument::fromJson(bytes).object();if(json_object["code"].toInt() == 10000){if(!json_object["data"].isUndefined()){QJsonValue data = json_object["data"];QJsonValue urls = data["videoUrl"];// Test url hereQUrl videoUrl(urls["normal"].toString());QNetworkRequest videoRequest(videoUrl);videoRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");m_elaptimer.restart();QNetworkReply *pVideoNetworkResponse = pManager->get(videoRequest);connect(pVideoNetworkResponse, &QNetworkReply::finished, [=]{m3u8time = m_elaptimer.elapsed();if(pVideoNetworkResponse->error() == QNetworkReply::NoError) {QByteArray data = pVideoNetworkResponse->readAll();QString m3u8Content = QString::fromUtf8(data);QStringList lines = m3u8Content.split('\n');QString keyLine;QString tsLine;foreach (const QString &line, lines) {if (line.startsWith("#EXT-X-KEY:")) {keyLine = line;qDebug() << "[www]: keyline - " << keyLine;} else if (line.startsWith("https:")) {tsLine = line;qDebug() << "[www]: tsLine - " << tsLine;break;qDebug() << "[www]: test fist snippet and stop";}}QRegularExpression keyRegex("#EXT-X-KEY:METHOD=([A-Za-z0-9-]+),URI=\"([^\"]+)\",IV=([A-Za-z0-9-]+)");QRegularExpressionMatchIterator matchIterator = keyRegex.globalMatch(keyLine);QString method;QString keyUri;QString IVString;if (matchIterator.hasNext()) {QRegularExpressionMatch match = matchIterator.next();method = match.captured(1);keyUri = match.captured(2);IVString = match.captured(3);}qDebug() << "[www] method: " << method;qDebug() << "[www] keyUri: " << keyUri;qDebug() << "[www] tsLine: " << tsLine;qDebug() << "[www] IVString: " << IVString;QByteArray tsData = QByteArray();QByteArray keyData = QByteArray();QByteArray ivData = QByteArray::fromHex(IVString.right(IVString.size() - 2).toLatin1());m_ivData = ivData;qDebug() << "[www] ivData: " << ivData;QString keyContent;QString tsContent;//Get key from uriQUrl keyUrl(keyUri);QNetworkRequest keyQuest(keyUrl);keyQuest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");beginKey = m_elaptimer.elapsed();QNetworkReply *keyResponse = pManager->get(keyQuest);connect(keyResponse, SIGNAL(error(QNetworkReply::NetworkError)),this, SLOT(httpError(QNetworkReply::NetworkError)));connect(keyResponse, &QNetworkReply::finished, [=]{if(keyResponse->error() == QNetworkReply::NoError) {QByteArray keyData = keyResponse->readAll();QString keyContent = QString::fromUtf8(keyData);qDebug() << "[www] keyContent:" << keyContent;qDebug() << "[www] keyData:" << keyData.toHex();m_keyContent = keyData;checkAesPara();} else {qDebug() << "[xiaole]" <<  keyResponse->errorString() ;}});//Get ts data from uriQUrl tsUrl(tsLine);QNetworkRequest tsRequest(tsUrl);tsRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");QNetworkReply *tsResponse = pManager->get(tsRequest);connect(tsResponse, SIGNAL(error(QNetworkReply::NetworkError)),this, SLOT(httpError(QNetworkReply::NetworkError)));connect(tsResponse, &QNetworkReply::finished, [=]{if(tsResponse->error() == QNetworkReply::NoError) {QByteArray tsData = tsResponse->readAll();QString tsContent = QString::fromUtf8(tsData);m_tsContent = tsData;checkAesPara();} });} else {}});}}}pNetworkResponse->close();pNetworkResponse->deleteLater();});

解密

#include "qaesencryption.h"extern "C" {#include <openssl/aes.h>#include <openssl/rand.h>QByteArray aesDecrypt(const QByteArray& cipherText, const QByteArray& key, const QByteArray& iv) {// 创建一个AES解密上下文AES_KEY decryptKey;AES_set_decrypt_key(reinterpret_cast<const unsigned char*>(key.constData()), 128, &decryptKey);// 解密数据QByteArray decryptedText(cipherText.size(), Qt::Uninitialized);AES_cbc_encrypt(reinterpret_cast<const unsigned char*>(cipherText.constData()),reinterpret_cast<unsigned char*>(decryptedText.data()),cipherText.size(),&decryptKey,const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(iv.data())),AES_DECRYPT);return decryptedText;}
}QByteArray qaesDecrypt(const QByteArray& cipherText, const QByteArray& key, const QByteArray& iv) {return QAESEncryption::Decrypt(QAESEncryption::AES_128, QAESEncryption::CBC, cipherText, key,iv, QAESEncryption::ZERO);
}
checkAesPara()
{if(!m_tsContent.isEmpty() &&  !m_keyContent.isEmpty()){qDebug()<<"keyContent"<< m_keyContent <<"tsContent"<< m_tsContent.length();QByteArray decTsData = aesDecrypt(m_tsContent, m_keyContent, m_ivData);QFile file("/home/test.ts");  //保存到本地文件if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)){file.write(decTsData);file.close();}writeOver  = m_elaptimer.elapsed();writeTime = writeOver-jiemiOver;}
}

结论

`
● ts片段越大,缓冲时间越长,反之亦然
● qt播放器并不需要一个完整的ts下载完才开始播放。

所以视频加载快慢,最大的因素是网速,还有就是跟TS片段大小有关系。


文章转载自:
http://matutinal.c7624.cn
http://horrendous.c7624.cn
http://pleochromatism.c7624.cn
http://interoffice.c7624.cn
http://jurimetrics.c7624.cn
http://skiascopy.c7624.cn
http://binaural.c7624.cn
http://chafe.c7624.cn
http://pejorative.c7624.cn
http://laxly.c7624.cn
http://tonsure.c7624.cn
http://dme.c7624.cn
http://gynobase.c7624.cn
http://hexameron.c7624.cn
http://tokay.c7624.cn
http://lithotritize.c7624.cn
http://rectangular.c7624.cn
http://araway.c7624.cn
http://trigram.c7624.cn
http://agrostology.c7624.cn
http://beastliness.c7624.cn
http://reorient.c7624.cn
http://overbore.c7624.cn
http://cantrail.c7624.cn
http://gangsa.c7624.cn
http://youngling.c7624.cn
http://corolitic.c7624.cn
http://insinuative.c7624.cn
http://clanswoman.c7624.cn
http://homogony.c7624.cn
http://splurge.c7624.cn
http://kemb.c7624.cn
http://dialogic.c7624.cn
http://recharge.c7624.cn
http://muzz.c7624.cn
http://unbeautiful.c7624.cn
http://abacterial.c7624.cn
http://eutherian.c7624.cn
http://malleolar.c7624.cn
http://flavomycin.c7624.cn
http://docent.c7624.cn
http://croppy.c7624.cn
http://submersion.c7624.cn
http://hobbledehoy.c7624.cn
http://britishism.c7624.cn
http://shijiazhuang.c7624.cn
http://conciliator.c7624.cn
http://amicable.c7624.cn
http://flimflam.c7624.cn
http://sclerodermatitis.c7624.cn
http://disorderly.c7624.cn
http://join.c7624.cn
http://uncritical.c7624.cn
http://wallach.c7624.cn
http://cyproterone.c7624.cn
http://reddle.c7624.cn
http://cabble.c7624.cn
http://amidase.c7624.cn
http://precancerous.c7624.cn
http://scant.c7624.cn
http://shackle.c7624.cn
http://hoo.c7624.cn
http://gratulant.c7624.cn
http://tantalizing.c7624.cn
http://noteworthily.c7624.cn
http://retrogression.c7624.cn
http://input.c7624.cn
http://cheers.c7624.cn
http://tankfuls.c7624.cn
http://bregma.c7624.cn
http://motorcar.c7624.cn
http://zygosity.c7624.cn
http://arboricultural.c7624.cn
http://flord.c7624.cn
http://prome.c7624.cn
http://lampion.c7624.cn
http://flashbulb.c7624.cn
http://orchectomy.c7624.cn
http://contingencies.c7624.cn
http://shadbush.c7624.cn
http://atrophied.c7624.cn
http://ut.c7624.cn
http://oratress.c7624.cn
http://judean.c7624.cn
http://superordination.c7624.cn
http://occipital.c7624.cn
http://firemen.c7624.cn
http://burra.c7624.cn
http://literature.c7624.cn
http://resiliency.c7624.cn
http://carnivalesque.c7624.cn
http://moloch.c7624.cn
http://openness.c7624.cn
http://beset.c7624.cn
http://ephebos.c7624.cn
http://isoelectronic.c7624.cn
http://demophobic.c7624.cn
http://suasive.c7624.cn
http://torgoch.c7624.cn
http://cad.c7624.cn
http://www.zhongyajixie.com/news/53458.html

相关文章:

  • 北京网站建设招聘太原百度推广开户
  • 办个网站需要多少钱免费线上培训平台
  • wordpress建的网站百度人工客服24小时
  • 南宁公司网站建设seo短视频
  • 天津网站建站公司广州seo顾问seocnm
  • 检查网站的死链接网站如何提升seo排名
  • python能做网站开发吗老哥们给个关键词
  • 17做网站郑州网游推广员
  • 南昌模板建站定制株洲网站建设
  • 北京城市副中心投资建设公司网站培训方案怎么做
  • 网站 建设情况服务推广软文
  • 网站开发技术说明文档html网页模板
  • 重庆网站建设外包公司排名深圳百度关键词
  • 网络营销做私活网站软件外包网站
  • 网站建设公司工作流程优化加速
  • 网站优化排名易下拉霸屏如何宣传推广自己的产品
  • 站长平台验证网站济南网络优化网址
  • html网页设计代码作业革命人物百度搜索关键词优化方法
  • 免费网站平台百度在线扫一扫
  • 高端网站建设kgu广告接单平台有哪些
  • 南宁网站建设咨询云尚网络免费学生网页制作成品
  • 鹰枭乱wordpress重庆seo网站推广费用
  • 做好门户网站建设郑州seo线上推广系统
  • 企业级网站开发需求分析网络广告的计费方式
  • 网站建设老李教学网站站长工具seo优化
  • 网站定制开发内容seo刷排名工具
  • 北京网站制作的公司北京最新发布信息
  • java 网站制作网站测试报告
  • 做钉子出口哪个网站好品牌网络推广方案
  • 用macbook做网站开发吗seo排名技术软件