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

企业网站源码安装教程.net招聘网站怎么做

企业网站源码安装教程,.net招聘网站怎么做,如何做vip视频网站,家用电脑可以做网站吗介绍 工作开发中需要处理的文件很多并无音频#xff0c;针对这一场景#xff0c;这里分享工作中自己封装使用的类库。精简的代码实现了播放、暂停、停止、快进、快退、进度跳转、倍速播放功能。直接放代码#xff0c;方便后期复制使用。 代码 头文件 /*** file videopla…介绍 工作开发中需要处理的文件很多并无音频针对这一场景这里分享工作中自己封装使用的类库。精简的代码实现了播放、暂停、停止、快进、快退、进度跳转、倍速播放功能。直接放代码方便后期复制使用。 代码 头文件 /*** file videoplayer.h* brief ffmpeg实现视频解码* author ZXT* date 2023.12.23*/#ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H#include QThread #include QDebug #include QImageextern C { #include libavformat/avformat.h #include libavcodec/avcodec.h #include libswscale/swscale.h #include libavutil/imgutils.h #include libavutil/time.h }class VideoDecoder : public QThread {Q_OBJECT public:explicit VideoDecoder(QObject *parent nullptr);~VideoDecoder();/*** brief 开始播放* param path入参 路径*/void startPlay(const QString path);/*** brief 停止播放*/void stopPlay();/*** brief 暂停或继续播放* param pause入参 ture暂停 false继续*/void pausePlay(bool pause);/*** brief 进度跳转播放* param sec入参 跳转的秒数*/void seekPlay(int sec);/*** brief 倍速播放* param speed入参 播放速度*/void speedPlay(float speed 1.0);signals:/*** brief 播放时长* param sec入参 时长秒数*/void sigDuration(int sec);/*** brief 播放位置* param sec入参 当前秒数*/void sigPlayPosition(int sec);/*** brief 播放结束* param ret出参 状态码*/void sigPlayFinished(int ret);/*** brief 发送解码后的显示图像* param image出参 视频图像*/void sigSendImage(const QImage image);protected:void run();private://运行标志volatile bool m_isRun false;//暂停状态volatile bool m_pause false;//进度跳转状态volatile bool m_seek false;//优化跳转速度volatile bool m_seekFilter false;//文件路径QString m_filePath;//开始时间 ms单位int64_t m_startTime 0;//暂停时间 ms单位int64_t m_pauseTime 0;//跳转时间 ms单位int64_t m_seekTime 0;//时长信息 秒int m_videoDuration 0;//播放速率float m_speedValue 1.0;//上一次的播放速率float m_lastSpeedValue 1.0; };#endif // VIDEOPLAYER_H 实现文件 #include videoplayer.hVideoDecoder::VideoDecoder(QObject *parent) : QThread(parent) {}VideoDecoder::~VideoDecoder() {quit();wait(); }//开始播放 void VideoDecoder::startPlay(const QString path) {m_filePath path;m_isRun true;m_pause false;m_seek false;m_speedValue 1.0;m_lastSpeedValue 1.0;this-start(); }//停止播放 void VideoDecoder::stopPlay() {m_pause false;m_seek false;m_isRun false; }//暂停或继续播放 void VideoDecoder::pausePlay(bool pause) {m_pause pause;if(pause){m_pauseTime av_gettime_relative() / 1000;}else{int offset av_gettime_relative() / 1000 - m_pauseTime;m_startTime offset;} }//进度跳转播放 void VideoDecoder::seekPlay(int sec) {if(!m_isRun)return;if(m_videoDuration sec)sec - 2;m_seekTime sec * 1000;m_seekFilter true;m_seek true; }//倍速播放 void VideoDecoder::speedPlay(float speed) {int64_t elapsed av_gettime_relative() / 1000 - m_startTime;int offset elapsed - (elapsed * this-m_lastSpeedValue / speed);m_startTime offset;m_speedValue speed;m_lastSpeedValue speed; }void VideoDecoder::run() {qDebug() VideoDecoder start m_filePath;std::string temp m_filePath.toStdString();AVFormatContext *inFmtCtx avformat_alloc_context();int ret avformat_open_input(inFmtCtx, temp.c_str(), NULL, NULL);if (ret 0){qDebug() open input error;emit sigPlayFinished(-1);return;}//获取流信息ret avformat_find_stream_info(inFmtCtx, NULL);if (ret 0){qDebug() find stream info error;emit sigPlayFinished(-1);return;}//获取视频流信息 目前只有视频流bool getVideo false;int videoIndex av_find_best_stream(inFmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);AVStream *videoStream NULL;AVCodec *videoDecoder NULL;AVCodecContext *videoDeCodecCtx NULL;if (videoIndex 0){videoStream inFmtCtx-streams[videoIndex];//初始化解码器videoDecoder avcodec_find_decoder(videoStream-codecpar-codec_id);videoDeCodecCtx avcodec_alloc_context3(videoDecoder);if(videoDeCodecCtx ! NULL){avcodec_parameters_to_context(videoDeCodecCtx, videoStream-codecpar);ret avcodec_open2(videoDeCodecCtx, videoDecoder, NULL);if(ret 0)avcodec_free_context(videoDeCodecCtx);elsegetVideo true;}}if(!getVideo){avformat_close_input(inFmtCtx);emit sigPlayFinished(-1);return;}AVFrame *swsFrame av_frame_alloc();SwsContext *swsCtx nullptr;uint8_t *videoData nullptr;//输出视频参数信息if(getVideo){int srcW videoStream-codecpar-width;int srcH videoStream-codecpar-height;AVPixelFormat format videoDeCodecCtx-pix_fmt;m_videoDuration inFmtCtx-duration / AV_TIME_BASE;emit sigDuration(m_videoDuration);int byte av_image_get_buffer_size(AV_PIX_FMT_RGB32, srcW, srcH, 1);videoData (uint8_t *)av_malloc(byte * sizeof(uint8_t));av_image_fill_arrays(swsFrame-data, swsFrame-linesize, videoData, (AVPixelFormat)AV_PIX_FMT_RGB32, srcW, srcH, 1);swsCtx sws_getContext(srcW, srcH, (AVPixelFormat)format, srcW, srcH, (AVPixelFormat)AV_PIX_FMT_RGB32, SWS_FAST_BILINEAR, NULL, NULL, NULL);}//开始时刻m_startTime av_gettime_relative() / 1000;int64_t ptsTime 0;int64_t ptsBackup 0;int curPlayPos 0;AVPacket *packet av_packet_alloc();AVFrame *videoFrame av_frame_alloc();while(m_isRun){//暂停if(m_pause){QThread::msleep(200);continue;}//进度切换if(m_seek){//跳转的播放时刻 单位微秒int64_t timeStamp m_seekTime * 1000;if (inFmtCtx-start_time ! AV_NOPTS_VALUE){timeStamp inFmtCtx-start_time;}//注seek若关键帧间隔大需避免延时timeStamp av_rescale_q(timeStamp, AVRational{1, AV_TIME_BASE}, videoStream-time_base);ret av_seek_frame(inFmtCtx, videoIndex, timeStamp, AVSEEK_FLAG_BACKWARD);if(ret 0){qDebug() av_seek_frame fail m_seekTime;}else{//清空内部帧队列if(videoDeCodecCtx)avcodec_flush_buffers(videoDeCodecCtx);//调整时钟int64_t offset m_seekTime - ptsTime;m_startTime - offset;}m_seek false;}//不断读取packetret av_read_frame(inFmtCtx, packet);if (ret AVERROR_EOF){m_isRun false;break;}if(packet-stream_index videoIndex){//编码数据进行解码ret avcodec_send_packet(videoDeCodecCtx, packet);if (ret 0){av_packet_unref(packet);continue;}ret avcodec_receive_frame(videoDeCodecCtx, videoFrame);if (ret 0){av_packet_unref(packet);continue;}//计算当前帧实际时间 msptsTime videoFrame-pts * av_q2d(videoStream-time_base) * 1000;if(m_seekFilter){//跳转播放时间不符合的帧直接丢弃 默认阈值200msint offset m_seekTime - ptsTime;if(0 offset || offset 200){m_seekFilter false;}else{av_frame_unref(videoFrame);av_packet_unref(packet);continue;}}//倍速将改变原pts值 太高倍速会导致解码消耗过高、渲染过频繁可考虑抽帧ptsBackup ptsTime;ptsTime * (1 / m_speedValue);//控制速度 ms单位qint64 elapsed av_gettime_relative() / 1000 - m_startTime;int64_t sleepMs ptsTime - elapsed;if(sleepMs 3){QThread::msleep(sleepMs);}//发送播放位置信息int sec ptsBackup / 1000;if(sec ! curPlayPos){curPlayPos sec;emit sigPlayPosition(curPlayPos);}//将解码后的frame数据转换为Imagesws_scale(swsCtx, (const uint8_t *const *)videoFrame-data, videoFrame-linesize, 0, videoFrame-height, swsFrame-data, swsFrame-linesize);QImage image((uchar *)videoData, videoFrame-width, videoFrame-height, QImage::Format_RGB32);QImage copy image.copy();emit sigSendImage(copy);av_frame_unref(videoFrame);}av_packet_unref(packet);}//释放资源sws_freeContext(swsCtx);av_frame_free(swsFrame);av_free(videoData);av_packet_free(packet);av_frame_free(videoFrame);avcodec_free_context(videoDeCodecCtx);avformat_close_input(inFmtCtx);emit sigPlayFinished(0);qDebug() VideoDecoder end m_filePath;return; }
http://www.w-s-a.com/news/955859/

相关文章:

  • 网站改版竞品分析怎么做中山网站建设文化价格
  • 玉林市网站开发公司电话做网站空间 阿里云
  • 南充做网站略奥网络免费的正能量视频素材网站
  • 电子商务网站开发的基本原则汕头网站制作流程
  • 网站访问量突然增加合肥宣传片制作公司六维时空
  • 建设购物网站流程图怎么找网站
  • 阿里云部署多个网站制作小程序网站源码
  • 博罗东莞网站建设网站免费源代码
  • 网站规划与设计范文桂平网站建设
  • 网站备案号密码wordpress邮箱发送信息错误
  • 模板的网站都有哪些关键词搜索工具爱站网
  • 鲜花网站建设的利息分析企业网站建设方案书
  • 深圳网站平台石家庄做商城网站的公司
  • 微网站营销是什么私人订制网站有哪些
  • 浙江建设工程合同备案网站新手做网站教程
  • 网站优化关键词排名自己怎么做wordpress安装主题失败
  • 成都建设银行招聘网站网站的切换语言都是怎么做的
  • 网站网业设计wordpress 很差
  • 网站开发软件著作权归谁网站悬浮窗广告
  • 如何提升网站alexa排名货运网站源码
  • 如何看自己网站流量梧州网站设计理念
  • 商城网站建设特点有哪些信息门户
  • 弄一个网站临沂有哪几家做网站的
  • 广州个人网站制作公司网站建设公司价
  • 免费建设网站赚钱小程序开发文档pdf
  • ucenter 整合两个数据库网站网店推广技巧
  • 网站优化排名提升百度wap
  • 八里河风景区网站建设内容摘要网站开发基础学习
  • 上海做外贸网站的公司智慧团建网站登陆平台
  • 上海商务网站建设如何做的网站手机可以用吗