码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • FFMPEG+SDL简单视频播放器——视频快进


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

    实现

    添加参数

    // 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的简单的视频播放器分析 》

  • 相关阅读:
    JWT相关知识
    label的作用是什么?是怎么用的?(3)
    计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解
    leetcode 416. Partition Equal Subset Sum 分割等和子集(中等)
    基于AI与物联网技术的智能视频监控系统架构剖析
    HTML5期末大作业——HTML+CSS+JavaScript平遥古城旅游景点介绍(6页)
    查看HTTP协议的通讯过程
    Android摄像头横屏的时候_人脸预览横向显示_问题解决---Android原生开发工作笔记164
    ABeam中国2022社招 | ABeam旗下德硕管理咨询(上海) 热招岗位虚位以待
    Java中的抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/Azion/p/17756274.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号