ffmpeg QT实现播放器的进度条

7 篇文章 0 订阅

在这里插入图片描述
如图,进度条是用qslide控件:

用法:
QSlider *playSlider = new QSlider;
playSlider ->setRange(0,100); //设置进度条最小值和最大值(取值范围)
playSlider ->setMinimum(0); //设置进度条最小值
playSlider ->setMaximum(100); //设置进度条最大值
playSlider ->setValue(50); //设置当前的运行值
playSlider ->reset(); //让进度条重新回到开始
playSlider ->setOrientation(Qt::Horizontal); //水平方向
playSlider ->setOrientation(Qt::Vertical); //垂直方向
playSlider ->setAlignment(Qt::AlignVCenter); // 对齐方式
playSlider ->setTextVisible(false); //隐藏进度条文本
playSlider ->setFixedSize(258,5); //进度条固定大小
playSlider ->setInvertedAppearance(true); //true:反方向 false:正方向
playSlider ->setVisible(false); //false:隐藏进度条 true:显示进度条

void Thread_playbra::run()
{
    QSlider *playSlider = new QSlider;
    playSlider->setOrientation(Qt::Horizontal);
    playSlider->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
    playSlider->setFixedSize(640,10);//长和宽控制
    playSlider->setRange(0,(int)times);
    playSlider->setValue(0);
    playSlider->setSingleStep(1);
//  playSlider->setTickPosition(QSlider::TicksAbove);  //刻度在上方
    playSlider->setVisible(true);
    sleep(1);

    float final_time;
    while(1)
    {
        //get_master_clock(is)获取当前播放进度,刷新进度条
        final_time = get_master_clock(is);
        playSlider->setValue((int)final_time);
        playSlider->setVisible(false);
        playSlider->setVisible(true);
//        printf("total:%f - %f - %f - %f\n",times,final_time,get_audio_clock(is),get_video_clock(is));
//        fflush(stdout);
        usleep(100000);//每0.1秒刷新一次进度条

        if(final_time >= times)
        {
            playSlider->setValue((int)final_time);
            final_time = times;
            break;
        }
    }
}

下面是使用QProgressBar实现,两个用法基本一致。

void Thread_playbra::run()
{
    QProgressBar *playProBra = new QProgressBar;
    playProBra->resize(400,400);
//    playProBra->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
    playProBra->setOrientation(Qt::Horizontal);
    playProBra->setRange(0,31);
    playProBra->setValue(0);
//    playProBra->setFormat(tr("text"));
    playProBra->setFixedSize(640,10);
    playProBra->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
    playProBra->setVisible(true);
    sleep(1);
    float final_time;
    while(true)
    {
        usleep(100000);
    //times
        final_time = get_master_clock(is);
        playProBra->setValue((int)final_time);
        playProBra->setFormat(tr("%1%").arg(QString::number(final_time,'f',1)));
        printf("total:%f - %f - %f - %f\n",times,final_time,get_audio_clock(is),get_video_clock(is));
        fflush(stdout);
        if(final_time >= times)
        {
            playProBra->setValue(final_time);
            final_time = times;
            break;
        }
    }
}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
你好!对于使用QtFFmpeg开发音视频播放器,你可以按照以下步骤进行: 1. 下载和安装FFmpeg库:你可以从FFmpeg官方网站下载预编译的库文件,根据你的操作系统选择相应的版本并进行安装。 2. 创建Qt项目:打开Qt Creator,创建一个新的Qt Widgets或Qt Quick应用程序项目。 3. 配置项目文件(.pro):在项目文件中添加FFmpeg库的路径和链接选项。例如,你可以添加以下内容: ``` INCLUDEPATH += /path/to/ffmpeg/include LIBS += -L/path/to/ffmpeg/lib -lavformat -lavcodec -lavutil -lswscale ``` 确保将`/path/to/ffmpeg`替换为你的FFmpeg库的实际路径。 4. 创建音视频播放器界面:使用Qt Designer创建一个用户界面,包含播放按钮、进度条、音量控制等。 5. 编写播放器逻辑:在Qt代码中使用FFmpeg库进行音视频解码和播放。你需要了解如何使用FFmpeg的API来打开音视频文件、读取音视频帧、解码帧数据,并将解码后的数据渲染到屏幕上。 示例代码: ```c++ // 引入FFmpeg头文件 extern "C" { #include <libavformat/avformat.h> #include <libswscale/swscale.h> #include <libavcodec/avcodec.h> } // 初始化FFmpeg库 av_register_all(); // 打开音视频文件 AVFormatContext* formatContext = avformat_alloc_context(); if (avformat_open_input(&formatContext, "/path/to/video.mp4", nullptr, nullptr) < 0) { // 打开文件失败 return; } // 查找音视频流信息 if (avformat_find_stream_info(formatContext, nullptr) < 0) { // 获取流信息失败 avformat_close_input(&formatContext); return; } // 查找视频流索引 int videoStreamIndex = -1; for (int i = 0; i < formatContext->nb_streams; i++) { if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIndex = i; break; } } if (videoStreamIndex == -1) { // 没有找到视频流 avformat_close_input(&formatContext); return; } // 获取视频解码器参数 AVCodecParameters* codecParameters = formatContext->streams[videoStreamIndex]->codecpar; // 查找视频解码器 AVCodec* codec = avcodec_find_decoder(codecParameters->codec_id); if (!codec) { // 没有找到解码器 avformat_close_input(&formatContext); return; } // 创建解码器上下文 AVCodecContext* codecContext = avcodec_alloc_context3(codec); if (!codecContext) { // 解码器上下文创建失败 avformat_close_input(&formatContext); return; } // 配置解码器上下文参数 if (avcodec_parameters_to_context(codecContext, codecParameters) < 0) { // 配置解码器上下文参数失败 avcodec_free_context(&codecContext); avformat_close_input(&formatContext); return; } // 打开解码器 if (avcodec_open2(codecContext, codec, nullptr) < 0) { // 打开解码器失败 avcodec_free_context(&codecContext); avformat_close_input(&formatContext); return; } // 读取视频帧并渲染 AVPacket packet; while (av_read_frame(formatContext, &packet) >= 0) { if (packet.stream_index == videoStreamIndex) { // 解码视频帧 AVFrame* frame = av_frame_alloc(); int ret = avcodec_send_packet(codecContext, &packet); if (ret >= 0) { ret = avcodec_receive_frame(codecContext, frame); if (ret >= 0) { // 渲染视频帧 // ... } } av_frame_free(&frame); } av_packet_unref(&packet); } // 清理资源 avcodec_free_context(&codecContext); avformat_close_input(&formatContext); ``` 这只是一个简单的示例,实际的音视频播放器可能需要更多功能和错误处理。你可以根据你的需求进行适当的调整和扩展。 希望这些信息能对你有所帮助!如果你有任何进一步的问题,请随时提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值