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

东莞做网站开发的公司虚拟币网站开发

东莞做网站开发的公司,虚拟币网站开发,金融网站建设方案书,wordpress发视频介绍 工作开发中需要处理的文件很多并无音频#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.hkea.cn/news/14415201/

相关文章:

  • 做热区的网站中国icp备案网站
  • 网站建设与设计学了做什么的宁波seo关键词优化方法
  • 温州网站制作设计网络营销公司注册找哪家
  • 手机建站图片网页设计入门基础知识
  • 学生做网站教程建网站中企动力
  • 网站浮动广告代码网站建设员岗位职责
  • 男生为女生做网站郑州网站设计见效快
  • wap网站 链接微信南阳网站优化排名
  • 上海站群优化wordpress内容修改
  • 不需要网站备案的广告联盟青岛网站建设多少钱
  • 做帖子的网站有哪些自适应影视网站模板
  • 开源网站建设工具永远免费的域名
  • 太原市建设银行网站网站建设实践总结
  • 纪检网站建设动态主题网站排名西安
  • 泰安润泽建设工程有限公司网站公司做网站要多长时间审核
  • 网站建设先进事迹西安企业网站开发
  • 网站开发工具 售价北京做网站的大公司有哪些
  • 青岛需要做网站的公司有哪些北京网站制作收费标准
  • 做仿网站的书html访问人数统计代码
  • 专业网站推荐18款禁用软件黄app免费
  • 河北pc端网站建设企业网站东莞网站建设制作
  • 做阀门网站效果怎么样英文网站 模板
  • 成品网站w灬源码1688用自己的名字设计头像
  • 越秀公司网站建设郑州网站关键词优化公司
  • 工厂的网站在哪里做的php做的购物网站
  • 网站session 验证网上书店网站建设规划书
  • 网站建设流程公司十堰秦楚网公众号
  • 在网站里面如何做支付工具网站关闭了域名备案
  • 手机搞笑网站模板下载安装seo系统
  • 精品网站建设费用 地址磐石网络长沙网站推广系统