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

高密做网站的代理网站空间

高密做网站的代理,网站空间,国外服装设计师网站,apm安装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.w-s-a.com/news/686630/

相关文章:

  • 运用django做网站网站建设问题及解决办法
  • 商丘企业网站服务c mvc 网站开发
  • 太仓建设工程网站广州seo排名外包
  • 成都的教育品牌网站建设做网站不给提供ftp
  • 建站行业市场人力管理系统
  • qq钓鱼网站在线生成器google关键词搜索工具
  • 化妆网站模板移动网站建设模板
  • 欢迎访问语文建设杂志网站网站蓝色配色
  • 最新网站发布重庆城乡建设部网站首页
  • 网站建设费用高鄂尔多斯seo
  • dw做网站怎么发布网站无后台可以上框架
  • 网络公司如何建网站网站的建设需要多少钱
  • 代刷网站推广快速泉州网页定制
  • 网站优秀网站地址做宣传册的公司
  • 苏州高端网站建设咨询wordpress云图插件
  • 河北省建设厅网站重新安装优秀中文网页设计
  • 如何在腾讯云做网站开源站群cms
  • 公司网站建设的意义网易做网站
  • 网络营销案例分析与实践搜外seo
  • 手机建网站挣钱吗wordpress面包屑
  • 淘客做网站怎么备案网站开发工具的是什么
  • 提供大良网站建设郑州网站建设网站开发
  • 邢台做wap网站价格wordpress评论滑动
  • 绝味鸭脖网站建设规划书江苏建设人才网 官网
  • 网站源码授权破解centos wordpress 整站
  • 建设一个私人视频网站wordpress js
  • 手机企业网站制作流程3d建模自学
  • 网站优化方案和实施wordpress的归档
  • 建设事业单位网站多少钱集艾设计公司官网
  • 网站建设与管理方案书图片的制作方法