这是一篇学习FFmpeg的技术文章,主要是使用FFmpeg获取本地视频文件的第一帧数据转换为Bitmap,然后抛给上层ImageView显示。 大致流程可以分为: 传入视频文件路径,解封装 找到视频流,从流中找到解码器 打开解码器,读取第一个完整的AVFrame帧 创建bitmap,使用libyuv将yuv转为argb关联给bitmap显示 释放资源 先定义JNI函数 Java函数: publicstaticnativeBitmapgetCover(Stringpath); JNI函数: JNIEXPORTjobjectJNICALLJava_demo_simple_e...

  Na90eeatuGJj   2023年11月13日   27   0   0 ide视频流android

https://glumes.com​​ 周末在家折腾Windows平台下FFmepg和LibX264库的编译,长期以来都是在Mac平台下做开发,切换到Windows平台下还是踩了不少坑。 参考了网上很多编译文章,质量也是参差不齐,版本也是五花八门,但归根到底还是Window下编译环境太坑爹了。 由于Windows上的命令行工具不好用,所以需要安装MSYS或者Cygwin这样的软件,它们的作用就是模拟Linux环境,其中MSYS还分1.0和2.0版本,有的博客文章比较久远,还使用的1.0版本了。 机智地没有选择走Cygwin这条路线,节省了不少时间,但还是踩了MSYS1.0版本的坑。 如果你...

  Na90eeatuGJj   2023年11月13日   33   0   0 静态库Windows#include

目前已经完成了项目的创建,是怎样一个项目呢? 首先是播放器SDK,也是项目最核心的模块,然后是对SDK进行单元测试的模块,最后是使用SDK做播放器的可视化项目模块。 项目工程的每个目录介绍已经在上篇文章中讲过了,这里会说一下如何打开项目。 如图所示,1和2代表两个CMakeLists.txt文件,其中1代表的是SDK工程CMake配置文件,2代表的是播放器工程CMake配置文件。 图标3作为新增的库文件目录,后面会介绍。 项目根目录是作为SDK的目录,而demo是在根目录下的子目录中,同时demo依赖根目录SDK的编译结果,这种项目配置在一些开源项目中还是很常见的。 当用CLion打开工程...

  Na90eeatuGJj   2023年11月13日   26   0   0 静态库头文件根目录

总结了一下AVPacket与AVFrame中拷贝和释放相关操作。 这里我理解在AVFrame与AVPacket传递流转的过程中并不会去每次创建和拷贝音视频数据,音视频数据被存储在AVBuffer中,而AVFrame与AVPacket在流转时进行浅拷贝,只有调用其对应unref时,会减少AVBuffer中的引用计数,最终释放内部存储音视频数据的buffer。 1.av_freep释放并置空双重指针指向的那个指针 释放内存并将指针置空 voidav_freep(voidarg){voidval;//记录arg值memcpy(&val,arg,sizeof(val));//arg指向...

  Na90eeatuGJj   2023年11月02日   41   0   0 数据音视频引用计数

昨天周六,群里面还有人在技术交流!!。 默默吐槽一下:这些人真卷啊,大周末还搞技术,是游戏不好玩还是电影不好看,他们肯定不知道EDG总冠军吧。 一开始是讨论剪映的100变速是如何实现,群主作为相关人士肯定就不方便透露这些了,不过也有其他大佬给出了思路。 讨论焦点还是围绕如何丢帧展开的。 百倍变速,比如正常速度下一帧是播放第1s时刻的内容,而变速后要播放100s时刻了。 此时的逻辑有以下几种情况: 如果下一个播放时刻要超过目前GOP大小了,那么就及时seek到离目标pts最近的关键帧,比如从1s变速后到了100s,那就seek到第98s。 如果下一个播放时刻在同一GOP内了,那就继续往...

  Na90eeatuGJj   2023年11月02日   37   0   0 数据ide参考帧

声网Agora跨平台开发工程师卢旭辉带来了《Flutter2渲染原理和如何实现视频渲染》的主题分享,本文是对演讲内容的整理。 本次分享主要包括3个部分: Flutter2概览。 Flutter2视频渲染插件的实践。 Flutter2渲染原理(源码)。 其实Flutter1在国内的占有率并不算高,很多开发者可能知道Flutter的上层语言是基于Google的Dart(一个曾经企图取代JavaScript的语言,但最后以失败告终),而Dart语言也是很多开发者不太能接受Flutter的点。国内很多公司可能还是选用ReactNative或者坚持原生开发,不过伴随着Flutter2...

  Na90eeatuGJj   2023年11月02日   46   0   0 子类htmlflutter

FFmpeg模块分类 打开FFmpeg源码,会发现有一系列libavxxx的模块,这些模块很好地划分了代码的结构和分工。 libavformat,format,格式封装 libavcodec,codec,编码、解码 libavutil,util,通用音视频工具,像素、IO、时间等工具 libavfilter,filter,过滤器,可以用作音视频特效处理 libavdevice,device,设备(摄像头、拾音器) libswscale,scale,视频图像缩放,像素格式互换 libavresample,resample,重采样 libswresample,也是重采样,类似图像缩放 libp...

  Na90eeatuGJj   2023年11月02日   41   0   0 数据封装器音视频

背景 在优化视频客观全参考算法(主要是PSNR,SSIM,MS-SSIM)时,我们首先利用FFmpeg提供的API(avcodec_send_packet(),avcodec_receive_frame())对输入的两个MP4文件转成对应的YUV格式的数据文件,然后再基于这两份YUV数据文件进行计算,得到对应的结果。 但是,我们发现,MP4文件转成YUV数据后,总是会发生丢失视频最后几帧的现象。 为了弄清楚这个问题,查阅了FFmpeg的源码,并参考了网络上的资料,然后总结出了这篇文章。 FFmpeg的编解码API 从3.1版本开始,FFmpeg提供了新的编解码API来对音视频数据进行编解码操作...

  Na90eeatuGJj   2023年11月02日   43   0   0 数据状态机ide

这是关于FFmpeg和MediaCodec爱恨情仇系列的第三篇文章了。 之前写了FFmpeg调用MediaCodec进行硬解码的内容。 ​​FFmpeg调用AndroidMediaCodec进行硬解码​​ 另外也给出了FFmpeg的编译脚本,轻松搞定编译问题。 ​​老生常谈-FFmpeg的编译问题轻松搞定​​ 众所周知,MediaCodec的解码能力不仅可以解码出YUV数据,还能直接解码到Surface上。 在短视频领域中,MediaCodec解码到Surface上的能力反而更加常用,这样就能将画面转到OES纹理上,从而进行后续各种渲染操作。 之前介绍的FFmpeg调用MediaCo...

  Na90eeatuGJj   2023年11月02日   84   0   0 数据字段赋值

作者|阿曾 前言 在直播应用的开发过程中,如果把主播端消息事件传递到观众端,一般会以InstantMessaging(即时通讯)的方式传递过去,但因为消息分发通道和直播通道是分开的,因此消息与直播音视频数据的同步性就会出现很多问题。那么有没有在音视频内部传递消息的方法呢?答案是SEI。 金山云目前推出的直播问答解决方案中,就用到了SEI,阿曾作为一名视频云架构资深开发工程师,对于与视频相关的技术有着深刻的实践经验,今天给大家分享一下关于SEI的技术细节。 流媒体是采用流式传输方式在网络上播放的媒体格式,视频网站内容、短视频、在线直播这些视频形态,均属于流媒体的不同分支。流媒体大致包含三...

  Na90eeatuGJj   2023年11月02日   57   0   0 数据音视频码流

介绍 ffmpeg是一个很强大的框架,包含众多的编解码器、提供很多方便的函数用于解析或生成各种媒体文件。 大部分情况下,开发者使用ffmpeg开发应用程序,然而有时也有开发ffmpeg本身的需求,例如添加私有的编解码器,让应用程序开发者能够方便的使用上该codec。 这里介绍如何在ffmpeg中添加一个codec,以H264Encoder为例。 这里使用的ffmpeg版本为0e56321,commit的时间为2017.09.26。之所以这里明确说明版本号,是因为ffmpeg经历过一次较大的API变化。 网络上的例子和代码说明的文章,大部分都是针对以前旧的API,例如雷神的文章。 新的API主要...

  Na90eeatuGJj   2023年11月02日   58   0   0 数据ide回调函数

周末时候看到一篇推送说FFmpeg升级到5.0版本了。 其中提到FFmpeg引入了Vulkan驱动的新滤镜,用于视频水平、垂直翻转。 看到FFmpeg引入了Vulkan,想着这是要有什么大动作啊,直接利好Vulkan嘛? 后来又仔细看了下FFmpeg的Changelog,原来早在4.3版本就已经开始支持Vulkan了。 那时候就已经有滤镜支持了,比如scale_vulkan、chromaber_vulkan等。 而且还支持在Linux平台上通过Vulkan使用AMD的高级媒体框架(AMF)库,可以用GPU来进行H.264/HEVC的编码。(Windows平台用的是DirectX接口) 这里...

  Na90eeatuGJj   2023年11月02日   48   0   0 数据滤镜android

FFmpeg封装实现 本例子实现的是将视频数据和音频数据,按照一定的格式封装为特定的容器,比如FLV、MKV、MP4、AVI等等。 实现的过程,可以大致用如下图表示:    从图中可以大致看出视频封装的流程: 首先要有编码好的视频、音频数据。 其次要根据想要封装的格式选择特定的封装器。 最后利用封装器进行封装。 根据流程可以推倒出大致的代码实现: 利用给定的YUV数据编码得到某种CODEC格式的编码视频(可以参见上面提到的编码实现),同样的方法得到音频数据。 获取输出文件格式。获取输出文件格式可以直接指定文件格式,比如FLV/MKV/MP4/AVI等,也可以通过输出文...

  Na90eeatuGJj   2023年11月02日   64   0   0 数据封装ide

H264码流分两种组织方式,一种是AnnexB格式,一种是AVCC格式。 作者:码农小明 ​ 首先要了解的是H.264编码规范只是规定了如何编码,并没有规定以何种方式来排列编码后的数据。 就如同AES算法只是规定如何加密一组数据,并没有强制规定如果分组。H.264规范没有规定如何组织数据,但是在附录B中提供了一种可选方案,即AnnexB格式。 H.264NALU概念 H.264视频编码后的数据叫 ​​NALU(NetworkAbstractionLayerUnits)​​。 NALU有多种类型,分为两大类:​​VCL(VideoCodingLayer)​​​ 和&nbs...

  Na90eeatuGJj   2023年11月02日   51   0   0 数据码流写入文件

在Android平台上合成视频一般使用MediaCodec进行硬编码,使用MediaMuxer进行封装,但是因为MediaMuxer在某些机型上合成的视频在其他手机上播放会出现问题,而且只支持一个音频轨道,因此可以选用FFmpeg来封装编码后的音视频流。 具体流程如下: 1.创建FFmpegAVFormatContext AVFormatContextofmt_ctx=nullptr;intret=avformat_alloc_output_context2(&ofmt_ctx,nullptr,"mp4",filePath);AVOutputFormatofmt=ofmt_ct...

  Na90eeatuGJj   2023年11月02日   58   0   0 数据ide视频流

导言:这篇文章主要介绍在Android上SurfaceTexture的应用Flutter外接纹理,并给出了外接纹理的正确姿势,而阿里闲鱼的技术方案则是错误的姿势。 1背景知识 2实现原理 2.1性能 2.2应用 3闲鱼技术方案 4具体实现 4.1流程图 4.2关键代码 4.3效果示意图 5结语 1背景知识 当我们用flutter做实时视频渲染时,往往是要对视频或者相机画面做滤镜处理的,如图: 如果我们要用flutter定义的消息通道机制来实现这个功能,就需要将摄像头采集的每一帧图片都要从原生传递到flutter中,这样做代价将会非常大,因为将图像或视频数据通过消息通道实时...

  Na90eeatuGJj   2023年11月02日   51   0   0 flutter共享内存技术方案

前言 最近在做一些音视频领域的工作,这个领域基本绕不开FFmpeg,因此想对其源码进行一些研究,站着这个巨人的肩膀上,学习一下其设计思想以及实现思路,FFmpeg很多人最开始接触的应该都是它的命令和ffplay,这篇我们就先分析下ffmpeg命令的实现。 从问题出发 FFmpeg的命令结构是什么样的 怎么实现任意功能、配置的随意组装的 倒放这种非线性的情况是怎么处理的当不需要转码类似只需要转封装的话是如何处理的 命令结构 ffmpeg[global_options]{[input_file_options]-iinput_url}...{[output_file_options]ou...

  Na90eeatuGJj   2023年11月02日   40   0   0 数据sed数据解析

每个库的功能作用 在FFmpeg的编译中可以编译出了6个so动态库: libavcodec.solibavfilter.solibavformat.solibavutil.solibswresample.solibswscale.so 那么每个so库的作用是什么呢,都包含什么功能呢? libavcodec.so 是一个包含音频/视频编解码器解码器和编码器的库。libavfilter.so是一个包含媒体过滤器的库libavformat.so是一个包含用于多媒体容器格式的解复用器和封装复用器的库。libavutil.so 是一个包含简化编程功能的库,包括随机数生成器,数据...

  Na90eeatuGJj   2023年11月02日   52   0   0 数据编解码器封装格式

FFMpeg作为音视频领域的开源工具,它几乎可以实现所有针对音视频的处理,本文主要利用FFMpeg官方提供的SDK实现音视频最简单的几个实例:编码、解码、封装、解封装、转码、缩放以及添加水印。 接下来会由发现问题->分析问题->解决问题->实现方案,循序渐进的完成。 参考代码: ​​https://github.com/lazybing/ffmpeg-study-recording​​ FFMpeg编码实现 本例子实现的是将视频域YUV数据编码为压缩域的帧数据,编码格式包含了H.264/H.265/MPEG1/MPEG2四种CODEC类型。 实现的过程,可以大致用如下图表示: 从图中可以...

  Na90eeatuGJj   2023年11月02日   88   0   0 数据编码器码流

ffmpeg中使用到的多线程的概念: 共享变量的互斥 互斥锁(mutex-lock)是一种信号量,用来防止两个线程在同一时刻访问相同的共享资源,它有锁定状态和非锁定状态。 在任意时刻,一个线程要想存取共享数据,线程必须首先获得mutex-lock,当此线程释放此共享数据的时候必须对mutex-lock解锁,在一个任意的时间内,只有一个线程能锁定互斥锁,通过函数pthread_mutex_lock上锁,通过函数pthread_mutex_unlock解锁。 同步条件变量 条件变量用来提供另一种线程同步的方法,其基于实际的变量值来实现线程的同步操作,设置了条件变量的情况下,线程就不需要通过不停的轮...

  Na90eeatuGJj   2023年11月02日   48   0   0 条件变量主线程多线程
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~