视频播放相关记录

news2025/1/18 18:55:53

一、场景

    App应用测试在二次回归时,提出了安卓端视频定位不准的问题。

二、分析

   代码层面使用了安卓原始的MediaPlayer中的seekTo接口来定位:

 mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                    @Override
                    public boolean onInfo(MediaPlayer mp, int what, int extra) {
                        AFLog.d(TAG, "视频播放信息监听what="+ what +" firstEnter="+firstEnter);
                        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START){
                            //首次根据前端传递过来进行定位
                            if (firstEnter){
                                AFLog.d(TAG, "--------seekValue "+ seekValue );
                                if (seekValue != 0){
                                    mp.seekTo(seekValue*1000);
                                }
                                firstEnter = false;
                            }
                            //视频准备渲染完成,隐藏进度框
//                            if (mLoadingDialog !=null && mLoadingDialog.isShowing()){
//                                mLoadingDialog.dismiss();
//                            }
                            hidGifLoading();
                        }else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START ){
                            //视频缓冲
//                            if (null != mLoadingDialog){
//                                mLoadingDialog.show();
//                            }
                            showGifLoading();
                        }else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END ){
                            //视频缓冲
//                            if (mLoadingDialog !=null && mLoadingDialog.isShowing()){
//                                mLoadingDialog.dismiss();
//                            }
                            hidGifLoading();
                        }
                        return false;
                    }
                });

android seekto实现_关于Android VideoView seekTo不准确的解决方案

根据网上查到信息说这个seek可能是异步返回需要将这个播放动作放到seek完成后进行,尝试了没有效果。

然后看到了第二个可能得原因,关键帧。从ChatGpt的回答可能原因中也有这点。

在视频编码中,关键帧(Keyframe),也称为关键帧图像或I帧(Intra-frame),是视频序列中的特殊帧。关键帧是一种独立的图像,它不依赖于之前或之后的帧来进行解码,而可以独立地解码和显示。关键帧在视频编码中具有重要的作用,它影响着视频的压缩效率、快速随机访问以及编辑等方面。

视频编码通常使用压缩技术来减少文件大小和带宽占用。在视频序列中,连续的帧通常会共享一些相似的内容,这些相似之处可以通过引用之前的帧来进行压缩。然而,这种依赖性也会导致一些问题,比如:

  1. 快速随机访问困难: 如果视频序列中的帧之间有依赖关系,那么要在视频中精确地跳转到某个时间点是比较困难的,因为你可能需要解码之前的帧才能显示目标帧。

  2. 编辑困难: 如果你想在视频中进行编辑、剪切或插入其他内容,依赖关系可能会导致编辑变得复杂,需要重新编码整个片段。

  3. 错误传播: 如果一个帧出现了错误,它可能会影响之后的帧的解码,导致错误在整个序列中传播。

关键帧解决了上述问题,它是独立的、不依赖于其他帧的帧。关键帧包含了完整的图像数据,通常是原始或未压缩的图像。在视频编码中,通常会周期性地插入关键帧,以便提供快速随机访问点和编辑的可能性。其余的帧通常是根据关键帧和之前的帧来进行预测和差异编码,以达到更高的压缩效率。

总之,关键帧在视频编码中扮演着重要的角色,它们提供了视频序列的重要参考点,有助于实现高效的压缩和解码,并提供了更好的随机访问和编辑能力。

于是使用了ffmpeg工具来分析视频中的关键帧是否足够:
 

ffmpeg -i input.mp4 -an -vf select='eq(pict_type\,I)' -vsync 2  -f image2 image-%03d.jpg

 

果然出问题的视频中总共才两个关键帧:

 

 

于是继续使用ffmpeg添加关键帧:

ffmpeg.exe -i "D:\in.mp4" -c:v libx264 -preset superfast -x264opts keyint=25 -acodec copy -f mp4 "D:\out.mp4"

ffmpeg 工具下载地址:

Releases · BtbN/FFmpeg-Builds · GitHub

通过让chatGpt生成bat脚本如下,集聚转换视频编码为h.264格式和添加关键帧功能:

@echo off
setlocal enabledelayedexpansion

REM 获取当前脚本所在的目录
set "script_dir=%~dp0"

REM 设置输入目录为当前脚本所在的目录
set "input_dir=%script_dir%input"

REM 设置输出目录为当前脚本所在的目录下的 "output" 子目录
set "output_dir=%script_dir%output"

REM 遍历输入目录下的所有视频文件并进行转换
for %%F in ("%input_dir%\*.mp4") do (
    set "input_file=%%~nxF"
    set "output_file=!output_dir!\%%~nF_converted.mp4"
    
    ffmpeg -i "%%F" -c:v libx264 -x264-params keyint=25 -c:a copy "!output_file!"
)

echo Conversion completed.
pause
 

 

 

来解决安卓端播放视频出现有声音无图像:video标签播放黑屏,只有声音无图像 - 简书

以及定位不准的问题。

苹果端使用avplayer却无此问题,不知为何。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/884599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多旋翼飞控底层算法开发系列实验 | 多旋翼动力系统设计实验1

多旋翼飞控底层算法开发系列实验 | 多旋翼动力系统设计实验1 01 多旋翼动力系统简介 多旋翼无人机的动力系统通常包括螺旋桨、电机、电调以及电池。动力系统是多旋翼最重要的组成部分,它决定了多旋翼的主要性能,如悬停时间、载重能力、飞行速度和飞行距…

The kernel appears to have died. It will restart automatically.

在使用pytorch运行一个小案例时,绘制图像时出现了 The kernel appears to have died. It will restart automatically. 查看 anaconda prompt OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means…

NestJs 中使用 mongoose

在 NestJS 中链接 MongoDB 有两种方法。一种方法就是使用TypeORM来进行连接,另外一种方法就是使用Mongoose。 此笔记主要是记录使用Mongoose的。所以我们先安装所需的依赖: npm i nestjs/mongoose mongoose安装完成后,需要在AppModule中引入…

前端基础学习笔记

目录 1.HTML部分1.HTML简介2.实例介绍3.标题4.段落5.链接6.图像7.表格8.速查列表1.基本文档2.基本标签3.文本格式化4.链接5.图片6.无序列表7.有序列表8.定义列表9.表格10.框架11.表单 2.CSS部分1.CSS简介1.什么是CSS2.为什么使用CSS3.CSS作用 2.基本用法1.CSS语法2.CSS应用方式…

Failed to resolve component: v-data-table“. vue3 + vuefity 使用 v-data-table 报错解决

在使用 vue3 vuetify 开发项目的过程中用到了 v-data-table 组件,结果在使用的过程中发现加载失败控制台报错。 [Vue warn]: Failed to resolve component: VDataTable解决方案: import { VDataTable } from vuetify/labs/VDataTable参考文档: https:…

双碳目标下基于“遥感+”多技术融合在碳储量、碳排放、碳循环、温室气体教程

详情点击链接:双碳目标下基于“遥感”多技术融合在碳储量、碳排放、碳循环、温室气体教程 一:双碳视角下遥感技术的研究方向 1.双碳背景及遥感的现实需求 2.全球碳库、碳收支及碳循环现状 3.碳储量、碳收支与碳循环中的遥感技术 4.ENVI及ArcGIS软件一体…

(三) CUDA 硬件实现

一组带有on-chip 共享内存的SIMD多处理器 GPU可以被看作一组多处理器, 每个多处理器使用单一指令,多数据架构(SIMD)【单指令流多数据流】 在任何给定的时钟周期内,多处理器的每个处理器执行同一指令,但操作不同的数据 每个多处理器使用以下…

广告ROI可洞察到订单转化率啦

toB广告营销人的一日三问&#xff1a; 如何实现线索增长&#xff1f;如何获取更多高质量线索&#xff1f;如何能用更少的钱拿到更多高质量的线索&#xff1f; < 广告营销的终极目标&#xff0c;就是提升ROI > 从ROI公式中&#xff0c;可以找到提升广告营销ROI的路径&…

Linux:shell脚本循环语句

目录 一、循环含义 二、echo命令 三、for 3.1.将1到100累加求和 3.2批量添加用户 3.3 根据IP地址检查主机状态 四、 while 和 until 4.1 猜价格 4.2 1-100求和 一、循环含义 循环含义 将某代码段重复运行多次&#xff0c;通常有进入循环的条件和退出循环的条件 重复…

kali搭建vulhub漏洞靶场

安装kali 下载kali作为虚拟环境&#xff0c; Get Kali | Kali Linux 通过vmvare打开&#xff0c;默认账号密码kali/kali 修改root密码 su passwd root 如果一些配置普通用户做不了就切换kali&#xff0c;或sudo 命令 kali配置 apt换源 echo > /etc/apt/sources.list v…

java对大文件分片上传

这里记录一下&#xff0c;Java对大文件的切分&#xff0c;和后端接口分片上传的实现逻辑 正常&#xff0c;前后端分离的项目其实是前端去切分文件&#xff0c;后端接口接收到切分后的分片文件去合并&#xff0c;这里都用java来记录一下。特别说明&#xff1a;我这里用的是zip包…

Codeforces Round 888 (Div. 3)ABC

Codeforces Round 888 (Div. 3) 目录 A. Escalator Conversations题目大意思路代码 B. Parity Sort题目大意思路代码 C. Tiles Comeback题目大意思路代码 A. Escalator Conversations 题目大意 判断有多少个人能够通过站在楼梯上的操作和VLAD一样高或者是VLAD通过站在楼梯上的…

6.1 MyBatis基础

1.MyBatis概述 MyBatis本是apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache software foundation迁移到了google code&#xff0c;并且改名为MyBatis&#xff0c;2013年11月MyBatis又被迁移到Github。 MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持…

欧拉算法与埃氏筛法比较

#include<iostream> using namespace std; bool data[100000005]; // zhishu用于存储质数的数组 &#xff0c;cnt下标 int zhishu[100000000],cnt0;int main() {data[1] 1;// 1表示素数 int n;cin >> n;// 循环遍历for(int i2;i<n;i){if(data[i] 0){// 表明是…

嵌入式学习之C语言指针部分复习

今天主要把C语言的指针部分再次认真的复习了一下&#xff0c;对于指针的整体框架有了更加深刻的理解&#xff0c;特别要重点区分函数指针&#xff0c;指针函数&#xff0c;数组指针&#xff0c;指针数组部分&#xff0c;对于这部分的应用回非常的重要&#xff0c;而且C语言指针…

海龟绘图——长方体(包含建立和销毁的过程)

运行结果&#xff1a; 代码&#xff1a; import turtle turtle.setup(1024,1024,200,200)# 移动画笔 turtle.penup() turtle.goto(-200,200) turtle.pendown() # 绘制第一条实线 turtle.setheading(0) turtle.forward(300) # 绘制第二条实线 turtle.setheading(18045) turtle.…

Python语法基础--条件选择

学习目标 使用比较运算符编写布尔表达式。使用random.randint(a,b)或者random.random()函数来生成随机数。编写布尔表达式(AdditionQuiz)。使用单向if语句实现选择控制。使用单向if语句编程。使用双向if-else语句实现选择控制。使用嵌套if和多向if-elif-else语句实现选择控制。…

winform使用IrisSkin4.dll换肤后排除控件

设置控件的tag属性为9999 参考&#xff1a; https://www.cnblogs.com/mq0036/p/6654219.html

YOLOV5改进:加入RCS-OSA模块,提升检测速度

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:RCS-OSA模块更加轻量化,有效提升检…