首页 > 其他分享 >FFMPEG+SDL简单视频播放器——视频快进

FFMPEG+SDL简单视频播放器——视频快进

时间:2023-10-11 09:48:21浏览次数:51  
标签:视频 FFMPEG printf 快进 length 跳转 SDL seek

之前写过一篇关于视频播放器的文章。播放器只简单实现了视频播放的功能,在此功能的基础上,给它加上一个视频快进的功能。

实现

添加参数

// video play control
    bool do_seek = false; // 播放状态
    int64_t seek_length = 5; // 快进秒数
    int64_t seek_pos; // 视频跳转到的位置
    int seek_dir; // 视频跳转方向(快进或者后退)
    int rem_seek;

键盘监听

添加SDL键盘监听事件,通过键盘控制视频的快进后退。

...
else if (event.type == SDL_KEYDOWN)
{
    if (event.key.keysym.sym == SDLK_SPACE)
        thread_pause = !thread_pause;
    // <- 控制后退
    else if (event.key.keysym.sym == SDLK_LEFT)
    {
        do_seek = true;
        seek_dir = 0;
    }
    // -> 控制快进
    else if (event.key.keysym.sym == SDLK_RIGHT)
    {
        do_seek = true;
        seek_dir = 1;
    }
    // q 退出播放
    else if (event.key.keysym.sym == SDLK_q)
    {
        thread_exit = 1;
    }
}
...

跳转参数获取

获取视频的时间基。根据时间基和视频实际跳转的秒数,计算出视频每次快进需要跳转的长度。

...
for (i = 0; i < pFormatCtx->nb_streams; i++)
{
    if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
    {
        videoindex = i;
        AVRational timebase = pFormatCtx->streams[i]->time_base; // 时间基
        printf("TimeBase: %d/%d\n", timebase.num, timebase.den);
        rem_seek = seek_length;
        seek_length *= timebase.den; // 实际跳转的长度
        printf("seek length: %d\n", seek_length);
        break;
    }
}
...

快进

在循环中监听视频状态,当视频状态为快进时,执行视频快进或后退操作

...
if (do_seek)
{
    printf("current packet pts: %d\n", packet->pts);
    // 快进
    if (seek_dir)
    {
        printf("Fast Forward %d s \n", rem_seek);
        seek_pos = packet->pts + seek_length;
    }
    // 后退
    else
    {
        printf("Rewind %d s \n", rem_seek);
        seek_pos = packet->pts - seek_length;
    }
    // 视频跳转
    if (av_seek_frame(pFormatCtx, videoindex, seek_pos, AVSEEK_FLAG_BACKWARD) < 0)
    {
        printf("Error while seeking\n");
        return -1;
    }
    // 视频跳转状态修改
    do_seek = false;
}
...

视频快进用到的核心函数为av_seek_frame。
av_seek_frame用于在媒体文件中寻找指定的帧(或者说时间位置)。这个函数通常用于跳转到媒体文件中的特定时间点或帧,以便从那里开始播放或处理媒体数据。

函数的一般形式为:

int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags);

参数说明:

  • s: AVFormatContext 结构体,表示媒体文件的上下文,包括媒体文件的信息和流信息。
  • stream_index: 要寻找的流的索引。
  • timestamp: 要寻找的时间位置,以微秒为单位。可以使用 AV_TIME_BASE 来进行时间单位的转换。
  • flags: 控制寻找行为的标志。

这个函数的返回值通常是零或正数,表示成功的跳转,或者是一个负数,表示出现了错误。
av_seek_frame 可以用于不同的媒体文件格式,包括音频、视频以及它们的组合。在视频播放器、音频编辑器等多媒体应用程序中,这个函数通常用于用户拖动进度条、跳转到指定时间点或进行其他用户交互操作。

源码

https://github.com/canaconZion/streaming-practice/blob/main/ffmpeg/src/video_player.cpp

关于视频播放部分的代码,可以参考文章《基于FFMPEG+SDL的简单的视频播放器分析 》

标签:视频,FFMPEG,printf,快进,length,跳转,SDL,seek
From: https://www.cnblogs.com/Azion/p/17756274.html

相关文章

  • 基于扩频的数字视频水印嵌入和检测算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述     在MPEG压缩标准中,数据流是以多路复合流的格式存储和传输的。多路复合流由音频流和视频流复合组成。多路复合流的基本单位时包,而一个包由三个组组成。组分为视频组和音频组,在此只介绍视......
  • 国标GB28181视频智能分析平台EasyGBS系统的设计与应用
    国标GB28181视频智能分析平台EasyGBS系统是一种基于GB28181-2016标准实现的网络视频平台,它负责实现核心信令与设备管理后台部分。该平台支持NAT穿透,可以接入海康、大华、宇视等品牌的IPC、NVR设备。它还支持国标级联,可以将不带国标功能的摄像机、直播流、直播推流转发到其他国标平......
  • 安防监控视频汇聚平台EasyCVR视频广场搜索异常,报错“通道未开启”的问题排查与解决
    安防视频监控系统EasyCVR视频汇聚平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。有用户反馈,在EasyCVR平......
  • 视频监控系统EasyCVR如何通过API接口获取国标GB28181协议接入的实时录像?
    安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等功能。平台也提供丰富的API接口供开发者集成、调用与二次开发。今天来介绍下......
  • 国标GB28181协议接入平台中,如何单独对某路监控视频流进行控制操作?
    GB/T28181协议从本质上说和ONVIF都是一样的,目的都是为了降低视频监控设备互联的难度。该协议都是基于IP网络,如果要对接,需要有相关的协议转换模块。协议之间也并不矛盾,可以实现接入上的互补。GB/T28181不仅包括设备间的级联,也包含系统的级联,故并不矛盾。如网络摄像机通过ONVIF协议......
  • 浅述安防视频可视化场景中TSINGSEE青犀AI智能化应用的分析
    随着社会的不断发展和安防需求的不断提升,安防视频可视化场景已经成为人们关注的焦点。而随着人工智能、大数据等技术的不断发展,智能化应用在安防视频可视化场景中的应用也越来越多。本文将分析安防视频可视化场景中的智能化应用,主要包括以下方面:背景介绍、智能化应用分析、关键技术......
  • 国标GB28181视频智能分析平台EasyGBS智能视频分析应用和适用场景
    国标GB28181视频智能分析平台可以实现对视频内容的实时监控和分析。通过对视频数据进行实时采集和传输,系统可以对视频画面进行实时分析和处理,包括人脸识别、车牌识别、行为分析等。这些功能可以帮助用户快速获取视频中的关键信息,提高安全防范能力。视频智能分析平台EasyGBS正从感......
  • 国标GB28181视频智能分析平台EasyGBS正从从感知阶段走向认知智能
    国标GB28181视频智能分析平台可以实现对视频内容的实时监控和分析。通过对视频数据进行实时采集和传输,系统可以对视频画面进行实时分析和处理,包括人脸识别、车牌识别、行为分析等。这些功能可以帮助用户快速获取视频中的关键信息,提高安全防范能力。​视频智能分析平台EasyGBS正从......
  • vue实现视频上传功能
    本文实例为大家分享了vue实现视频上传功能的具体代码,供大家参考,具体内容如下环境:vue+TS上传视频+上传到阿里云主要处理前端在vue下上传视频使用的是阿里云的视频点播服务1、需要后台去申请一个开发API,请求阿里云的接口访问控制2、有了开发视频的token,供给前端3、前端去请......
  • Lnton羚通视频分析算法开发平台建立工地人员入侵,构建工地实名制人员通道系统解决方案
    Lnton羚通的算法算力云平台是一款优秀的解决方案,具有突出的特点。它提供高性能、高可靠性、高可扩展性和低成本的特性,使用户能够高效地执行复杂计算任务。此外,平台还提供丰富的算法库和工具,并支持用户上传和部署自定义算法,提升了平台的灵活性和个性化能力。建筑工地的管理一直以来......