android开发之音视频(一)

java提取视频缩略图或某一帧的图片 这篇文章主要介绍了使用java提取视频缩略图或某一帧的图片功能的实现,在开发中,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 文章目录1 :添加POM依赖:2 :VideoToImageUtil 工具类3 :案例实图 1 :添加POM依赖: 代码如下依赖(示例): <!--start:视频获取某一帧的图片--> <dependency> <groupId>org.bytedeco. 阅读详情

转载请标明出处:
http://blog.youkuaiyun.com/AnalyzeSystem/article/details/78489729
本文出自Analyzesystem的博客

做android端音视频项目开发有几个月了,来做个小结


开发框架选取

android手机有很多自带播放器不支持流媒体播放、音频格式等因素,为此开发需要采用成熟开源框架或自己修改FFmpeg,长为人熟知的开源框架有一下几款:

  • vitamio
  • SmarterStreaming
  • GSYVideoPlayer
  • PLDroidPlayer
  • ijkplayer
    …………………….

    vitamio 要收费,七牛PLDroidPlayer 修改底层源码不方便(由于项目是视频监控行业,很多定制需求,要求能高度定制底层源码),最后采取bilibili开源的ijkplayer,GSYVideoPlayer虽然封装的很好,但是不适合手里项目。

关于ijkplayer so库编译,最好别再window下进行,容易出现符号占位符等问题。编译好后分别在 对应目录生成三个so库和一个.aar文件,依赖如果出现.aar 相关的类找不到(aar没有更新),而自己又确定有的情况下,可参考tip


gradle.properties

/***true:启用 build cache,反之禁用。如果这个参数未设置,默认是禁用 build cache.***/

android.enableBuildCache= 

当你遇到视频播放出来了但没声音,多数是音频格式支持问题,默认脚本没有添加太多的格式支持,需要自己修改,具体操作可参考issues

ijkplayer demo提供的仅TextureView渲染的才能截图,产品要求视频仿萤石云,能手势缩放拖拽、截图、、录像、语音对讲等功能,没办法视频播放器控件只能自己想办法,所幸找到了一个开源库ScaleVideoView

https://github.com/yushiwo/ScaleVideoView

视频相关功能博主这儿有专业人员修改ijkplayer源码,在IMediaPlayer为博主提供可调用函数以及相关接口监听器,修改ScaleVideoView源码以及so库依赖,添加相应函数调用即可。

Tip: 未播放过的视频也可以通过修改ijkplayer底层实现获取第一帧图(用于设置封面CoverView)

关于视频相关的控制统一称为控制器,控制器相关自动隐藏显示动画相关代码块如下

import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;

/**
 * Created by idea on 2017/10/23.
 */

public class TranslateAnimationHelper {

    private static void translateX(View view, int translateStartX,int translateEndX){
        Animation animation = new TranslateAnimation(translateStartX*view.getMeasuredWidth(), translateEndX*view.getMeasuredWidth(), 0, 0);
        animation.setDuration(500);
        animation.setRepeatCount(0);//动画的重复次数
        animation.setFillAfter(true);//设置为true,动画转化结束后被应用
        view.startAnimation(animation);//开始动画
    }

    private static void translateY(View view,int translateStartY,int translateEndY){
        Animation animation = new TranslateAnimation(0, 0,translateStartY*view.getMeasuredHeight(),translateEndY*view.getMeasuredHeight());
        animation.setDuration(500);
        animation.setRepeatCount(0);//动画的重复次数
        animation.setFillAfter(true);//设置为true,动画转化结束后被应用
        view.startAnimation(animation);//开始动画
    }

    public static void hideTopView(View view){
        TranslateAnimationHelper.translateY(view,0,-1);
    }

    public static void showTopView(View view){
        TranslateAnimationHelper.translateY(view,-1,0);
    }

    public static void hideBottomView(View view){
        TranslateAnimationHelper.translateY(view,0,1);
    }

    public static void showBottomView(View view){
        TranslateAnimationHelper.translateY(view,1,0);
    }

    public static void hideLeftView(View view){
        TranslateAnimationHelper.translateX(view,0,-1);
    }

    public static void showLeftView(View view){
        TranslateAnimationHelper.translateX(view,-1,0);
    }

    public static void hideRightView(View view){
        TranslateAnimationHelper.translateX(view,0,1);
    }

    public static void showRightView(View view){
        TranslateAnimationHelper.translateX(view,1,0);
    }

    public static void toggleVisibility(View left,View top,View right,View bottom,boolean isHide){
        if(isHide){
            hideView(left,top,right,bottom);
        }else{
            showView(left,top,right,bottom);
        }
    }

    private static void showView(View left, View top, View right, View bottom) {
        if(left!=null){
            hideLeftView(left);
        }

        if(top!=null){
            hideTopView(top);
        }

        if(right!=null){
            hideRightView(right);
        }

        if(bottom!=null){
            hideBottomView(bottom);
        }
    }

    private static void hideView(View left, View top, View right, View bottom) {
        if(left!=null){
            showLeftView(left);
        }

        if(top!=null){
            showTopView(top);
        }

        if(right!=null){
            showRightView(right);
        }

        if(bottom!=null){
            showBottomView(bottom);
        }
    }


}

录像回放关联的时间轴控件,采用开源控件TimeRule,不过源码需要二次修改


// https://github.com/dingyongxiang/TimeRulers

最终实现效果图



本篇仅为概述,如有雷同请忽略,下一篇博客进入主题..

Android音视频开发(一)之基础知识 一、视频录制 视频录制有两种方式: 调用系统相机录制 在Android中调用系统相机,通过Intent设置系统相机的Action,然后startActivity就可以启动。但这种方式在实际开发中通常不能很好满足业务需要,比如我要指定一下录制视频的码率、分辨率、预览画面的大小和视频画面的尺寸等。 自定义相机录制 自定义相机开发过程相对复杂,使用Android SDK提供的Camera和Mediarecorder类来完成,单纯使用Mediarecorder也能直接进行录制,但通常是前置方式来实现。相机相 阅读详情

相关推荐

Android ijkplayer的使用解析

详见http://blog.youkuaiyun.com/huaxun66/article/details/53401231

16.1-视频播放器

概述 一.在Android中,我们有三种方式来实现视频的播放: 1、使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。 2、使用VideoView来播放。在布局文件中使用VideoView结合MediaController来实现对其控制。 3、使用MediaPlayer类和SurfaceView来实现,这种方式很灵活。 本地资源 内部URI,...

Chents 1011

Canvas获取视频第一帧缩略图的实现

记录下一个疑问,最近在重新看canvas做点Demo这样,时间是写在2019年11月5日,以后要是没有这个问题了,以W3C更新的为标准,这个只是参考 尝试着在canvas中显示视频第一帧的时候碰上的问题:在Chrome中,用 video.addEventLisener(loadeddata,func)、 video.onloadeddata = func无法在函数中获取到 未预加载的视频的第一帧的图片。同样的代码在Firefox中 未预加载的视频可以获取到第一帧,并且能够渲染到canvas中。以下都是不进行预加载的情况下运行的。 要是不能运行了就在评论里说下,我是从写的一个Demo里截下来

flutter开发实战-ijkplayer视频播放器功能

使用better_player播放器进行播放视频时候,在Android上会出现解码失败的问题,better_player使用的是video_player,video_player很多视频无法解码。最终采用ijkplayer播放器插件,在flutter上使用fijkplayer插件。

一名开发者 4138

android 获取视频第一帧作为缩略图的方法

今天,简单讲讲android里如何获取一个视频文件的第一帧作为缩略图显示在界面上。 之前,我说个最近需要从服务器下载视频文件,但是下载后肯定需要显示视频的缩略图在界面上给用户看,于是想到显示视频的第一帧作为缩略图。但是我不知道具体怎么写,于是在网上查找资料,最终是解决了问题。这里记录一下。 一.使用MediaMetadataRetriever获取视频的第一帧作为缩略图 /** * 获取视频文件截图 * * @param path 视频文件的路径 * @return Bitmap 返回获取的Bitmap */ public static Bitmap getVideoThumb(String

WPF MVVM实战:构建可绑定的RichTextBox富文本编辑器

本文详细介绍了如何在WPF MVVM模式下构建可绑定的RichTextBox富文本编辑器,解决标准RichTextBox.Document属性不支持数据绑定的问题。通过创建自定义BindableRichTextBox控件,实现FlowDocument的绑定支持,并分享插入图片、文本格式控制等实战技巧,帮助开发者高效开发富文本编辑功能。

weixin_33717117的博客 305

ijkplayer 代码走读之 播放器网络视频数据读取过程详解

此部分网络读取视频数据代码另开一篇博文分析。 概念定义: PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来 DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码 也就是pts反映帧什么时候开始显示,dts反映数据流什么时候开始解码。 此部分主要是走读 ijkplayer 数据输入流,我们需要先看看相关数据结构,如下: typedef struct AVIOContext { /**

weixin_38387929的博客 1075

从零到一:构建嵌入式Nginx的模块化架构与跨平台部署实战

本文详细介绍了在ARM32架构的RV1126嵌入式设备上,通过交叉编译技术构建模块化Nginx服务器的完整实战流程。涵盖环境配置、依赖库编译、Nginx核心与http_ssl_module等模块集成、性能优化及部署调试,为嵌入式开发提供高效可靠的Web服务器解决方案。

rock5的博客 202

Android音视频开发入门(一)

前言 最近公司有需求要做一个视频编辑的功能,陆陆续续查了很多资料,因为之前没有接触过这一领域,开始是想用Android自带的API来实现,但是过了一个星期后,通过参考别人的范例写了一个视频裁剪的demo,各种问题,这一周基本就用来查找怎么去解决这些问题了,但是结果很现实,仍然不知道怎么去解决这些问题。突然发现如果还是这样继续下去的话,就算功能勉强实现了,当出现另一个问题后还是不知道怎么去快速解决。...

Lewis的专栏 1万+

北京途游游戏后端开发面经

北京途游游戏后端开发面经 我面试岗位是基于Python的后端开发工程师,主要是搞游戏的服务器开发。面试一共分了两轮,之后说是看看其他的候选人再定,感觉凉凉~~ 由于受到此次新型冠状病毒疫情的影响,本次面试采用视频面试的方式,下面是面试的时候面试官提的问题,python的基础知识还是问的比较多的。  一面:(32分钟微信视频)  简单做下自我介绍,   1.说一下你开发过的项目,挑一个说下你都做了...

weixin_45603043的博客 2124

LabVIEW与MySQL实时数据存储:传感器采集与数据库同步实践

本文详细介绍了如何将LabVIEW与MySQL结合,实现传感器数据的实时采集与高效存储。通过设计合理的数据库表结构、配置LabVIEW数据库连接工具包,并编写核心的采集与存储VI,构建了稳定可靠的数据链路。文章重点分享了批量插入、连接管理、时间同步等关键优化技巧与避坑指南,帮助工程师应对工业监控、环境监测等场景下的实时数据同步挑战。

weixin_29281915的博客 261

Android音视频开发(一)学习规划

目录序言学习规划音视频内容 序言 公司的项目有涉及到音视频的开发,但都是已经开发完的,想去看懂代码,但却无从下手,因为自己对音视频只有一个模糊的概念,所以从这个文章开始,从零入门,要把音视频弄懂,然后自己写一个demo。 学习规划 目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的,查找了很多资料,制定了一个学习路线。(Android音视频开发的学习系列文章主要是参考了Jhuster前辈的博客) 音视频内容 核心: 音视频技术=封装技术+视频压缩编码技术+音频压缩编码技术+流媒体协议技术

lywfmt的博客 1455

FCN---训练cityspaces

未经允许,不要随意转载! 最近想试试用FCN训练自己的数据集,想想标注是一件很费劲的事,于是就想到了用其他库里的数据,这里选用了cityspaces,默认已经配置好FCN. 1、下载cityspaces https://www.cityscapes-dataset.com/ 需要注册一个账号 cityspaces包含2...

wangyu088的专栏 2030

Android 音视频开发(一)

主要是让您了解一下音视频开发在Android原生中需要用到SDK中的哪一些API

weixin_44357587的博客 1399

【图像去噪】基础知识之加噪 | 给图像加噪的若干种方式,包括加高斯白噪声(AWGN)、泊松-高斯噪声、模拟真实噪声(SIDD、DND)等

本文介绍给干净图像加噪的若干种方式,新手入门必看!。根据noise类型不同,产生不同的Noisy,Noisy一般是模型输入。【图像去噪】基础知识之图像流 | 图像从输入到输出的前世今生,包括类型变化、维度变化、数值变化等。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1097

2023年全国城市房价分布网格数据

本文介绍了一份2023年全国主要城市房价分布的网格数据,数据以250米×250米的网格为单位,记录了住宅小区数量、均价、最高价和最低价等信息。数据采用GCJ-02坐标系,提供ShapeFile、GeoJSON和CSV三种格式

J_Giser的博客 374

Android音视频开发(一)音视频基础知识

前言 最近工作方面没有太多事,所以难得有些空闲时间,针对当前音视频app的流行,为了不让自己淘汰,提升自己的专业能力,于是决定学习音视频开发相关知识,然而自己这方面却是一个小白,所以希望通过博客的形式记录下自己一步一步学习的过程,也希望能给这方面的新手一些借鉴。 学习计划 1.了解音视频的基础知识 2.了解SurfaceView,TextureView的实现和使用 3.Android平台...

king的专栏 4049

在windows安装程序时出现 系统无法打开指定的设备或文件的解决方案

本文主要介绍了在windows安装程序时出现 系统无法打开指定的设备或文件的解决方案,希望能对使用windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

【音视频安卓开发 (一)】

#include <jni.h> #include <string> #include <android/log.h> extern "C" JNIEXPORT jstring JNICALL Java_com_example_first_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "I am BaoHangY.

用可见的方式来记录和分享每一次收获 155

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android音视频开发(一)——音视频开发流程

一、视频文件是什么? 视频文件就相当于是:音频码流和视频码流结合封装的一个容器。其中一个视频文件中可以放入多个音频码流和视频码流的文件。 并且从视频文件中导出来的视频压缩数据是不可以直接进行播放的(假设里面有两张相似的图片,其实并没有保存两张图片的完整信息,第二张图片可能只保存了与第一张图片的不同信息) 二、为什么要编码? 视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就...

indeedes的博客 6706

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

android音视频播放技术背景,Android音视频开发-入门(一)

赤壁赋壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨如慕,如泣如...

weixin_34271305的博客 306

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android WebRTC 音视频开发总结(一)

接触Android WebRTC有一段时间了,现在将研究过程中的一些经验和知识总结出来,希望大家有所帮助。本章主要介绍下面四点: 一、WebRTC是什么? WebRTC是Google提供的一个跨平台的音视频开源解决方案,旨在使其成为音视频通讯的标准。其实在Google将WebRTC开源之前,微软和苹果各自的通讯产品已占用很大市场份额(如Skype),估计Google也是为了快速扩大市场,所以选

tronteng的专栏 1463

Android FFMPEG音视频开发(一)

本文参考:https://blog.youkuaiyun.com/leixiaohua1020/article/details/18893769 突然想学习Android音视频领域,所以在网上疯狂找博客看,遇见了上面这篇博客,通读了一遍,写的真好。又翻看了作者其它的博客,很厉害。 淡泊明志 宁静致远 虽然作者已经写的很好了,但我还是想参考作者的再写一遍,一来是关注点不一样,二来是由于我的学习方法——费曼学习法...

WillScorpio 2071

音视频开发著作《Android音视频开发》终于发售了,先来一波签名送书福利!

经历了两年多,我的著作终于和大家见面了,写书是一件很磨练人耐力的事情,从打算写一本书开始后,心里无时不刻有一块大石头压在头顶。一来要保证专业性,二来要保证质量,同时还要兼具备怎么表达,才能让别人明白所说的意思。所以看起来没有那么简单。近年来,直播,短视频行业相关业务发展迅猛。Android音视频开发门槛相对高些,很多有特色或者核心模块基本都是NDK开发,而NDK开发很多实际上都是C/C++写的Co...

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 1万+

音视频开发(一)FFmpeg 编译安卓需要的SO动态库

音视频开发(一)编译安卓需要的SO动态库 1、下载FFmpeg(3.3.9) http://www.ffmpeg.org/download.html#releases 2、下载NDK(R13b) https://developer.android.google.cn/ndk/downloads/index.html 3、解压FFmpeg和NDK 解压Ffmpeg(tar -zxvf...

xiaorong_Dream的博客 517
上一篇: Android开发之蓝牙通信(三)
下一篇: android开发之音视频(二)
AnalyzeSystem
博客等级 码龄11年 204粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值