FFmpeg
文章平均质量分 86
介绍FFmpeg的入门API使用
FlyerGo
一个渴望蜕变的码农
展开
-
FFmpeg之硬解码
导读前面我们已经使用NDK编译出了FFmpeg并且已经集成到了Android Studio中去,相关文章:NDK21编译ffmpeg5.0.1众所周知,软解码虽然兼容性一流,但是却非常依赖CPU,所以性能消耗笔记大;硬解码使用内置的DSP芯片进行解码,性能高,但是兼容性一般。虽说硬解码兼容性不太好,但是在实际开发中出于对性能的考虑我们依然会采用能硬解则硬解,不能硬解则软解兜底的方案。我们知道安卓上可以使用MediaCodec进行硬解码,新版本FFmpeg内部也支持了MediaCodec硬解码,今天我原创 2022-04-29 20:40:33 · 8033 阅读 · 0 评论 -
NDK21编译ffmpeg5.0.1
导读对于想要学习音视频开发的android开发者来说,使用NDK对FFmpeg进行交叉编译是一道必须迈过去的坎,网上关于使用NDK对FFmpeg进行交叉编译的教程有很多,但是不经修改能顺利编译通过的比较少。其实参照网上的教程不能编译通过很多时候不是人家的教程写的有问题,很多时候更多的是因为环境的差异导致了编译出错,而对于一个入门者来说编译报错了自己却不知道怎么改。如果对交叉编译不太了解的童鞋们可以参考我之前写的文章:音视频学习之NDK交叉编译基础NDK编译FFmpeg今天我们来使用NDK对FFm原创 2022-04-29 20:39:58 · 3320 阅读 · 0 评论 -
ffplay音视频同步
前言对于音视频同步是有三种方案的,一种是以外部时钟为基准,音频时钟和视频时钟在播放时都以外部时钟为参考系,谁快了就等待,慢了就丢帧;第二种是以视频时钟为基准,音频时钟在播放的过程中参考视频时钟;第三种是以音频时钟为基准,视频时钟在播放的过程中参考音频时钟。由于人体器官对视觉的敏感读没有听觉的灵敏度高,因此为了更好的体验,在音视频同步时一般都是以音频时钟为基准的方案。那是不是说其他两种方案没有用处呢?也不是的,比如说一个只有视频没有音频的的视频文件,在播放的时候就需要以视频为基准了。今天介绍的音视频原创 2022-04-27 23:48:08 · 910 阅读 · 0 评论 -
ffplay音视频解码线程
前面我们介绍了ffplay的调试环境集成、ffplay总体架构、ffplay的读取线程等相关内容,今天介绍下ffplay解码线程工作流程。因为视频解码和音频解码的过程大概一致,因此本文主要介绍视频的解码线程内容,字幕的解码忽略…我们还是从这张图开始:图导出的可能有点模糊,再加上上传图床后不知道有没有更加模糊了,想要高清大图的可以后台留言,加v信索取。从图中可以看出,解码线程的主要工作内容是将资源包从待解码队列中取出,然后送进解码器,最后将解码出的数据帧放入帧队列中,等待SDL获取播放。解码过程原创 2022-04-27 23:46:47 · 1622 阅读 · 0 评论 -
ffplay数据读取线程
在前面我们介绍了ffplay的总体架构和一些关键的数据结构。今天我们还是从这张图开始,主要介绍ffplay的读取线程部分。图导出的可能有点模糊,再加上上传图床后不知道有没有更加模糊了,想要高清大图的可以后台留言,加v信索取。从ffplay的main函数入口开始阅读源码,发现是在函数stream_open创建了资源读取线程,读取线程执行的函数是read_thread,所以要分析读取线程的工作内容,我们只需读懂函数read_thread即可。下面是我加了注释的read_thread函数:/** *原创 2022-04-27 23:46:11 · 520 阅读 · 0 评论 -
ffplay整体框架
前言虽说ffplay是一个简单的播放器,但是其实内部一点也不简单,其实笔者也不知道说它简单的理由是什么,是因为它只有一个点c文件???ffplay内部细节繁多,想要深入分析不单单要掌握音视频的相关概念,还要掌握多线程等相关知识,但是不得不说ffplay确实是学习的播放器开发的一个最佳例子。建议想要学习ffplay的童鞋们集成后边阅读边增加注释,多阅读几次,相信你每次阅读都会有不同的理解与收获…本文使用的ffplay.c的版本是搭配ffmpeg5.0的版本。ffplay代码大致架构关于fplay的原创 2022-04-24 23:58:34 · 594 阅读 · 0 评论 -
ffplay调试环境搭建
前言ffplay是基于FFmpeg的最简单的官方播放器。麻雀虽小,五脏俱全,虽说ffplay简单,但是各种播放器应有的功能一一俱全,说它简单或许仅仅是因为它只有一个点c文件而已吧。想要开发一个优秀的播放器,参考是必不可少的,毕竟control c和control v是程序员天生的本能。以前遇到播放的问题向人请教的时,经常听到的一句话就是去看看ffplay是怎么处理的就知道怎么过解决了呀,可见ffplay在播放领域的地位不一般。。。而且想要学好FFmpeg,在了解了FFmpeg的基本知识和相关API之原创 2022-04-24 23:57:56 · 674 阅读 · 0 评论 -
FFmpeg连载8-视频合并以及替换视频背景音乐实战
前言通过前面的实战,我们实现音视频解封装提取、音视频解码、音视频编码、音频重采样等的功能,今天我们就结合之前所做的功能,来做一个短视频APP中常见的功能:1、提取多个mp3文件中的音频,重新编码为合并为aac2、提取mp4中的视频,重新编码合并为h2643、h264与aac合并成新的mp4文件因为我们的目的是以实战为主,为了囊括之前所学的一些知识点,在这个实战中我们不仅仅需要实现音视频解封装提取、音视频解码、音视频编码、音频重采样这些功能,我们还需要结合多线程同步等知识点做好生产者消费者队原创 2022-04-24 23:57:20 · 1326 阅读 · 0 评论 -
FFmpeg连载7-mp3转码aac及AVAudioFifo的使用
前言如今以抖音、快手为代表的短视频秀无处不在,比如它们一个很普通的功能就是使用流行音乐替换作为视频的背景音乐。而在视频中音频一般都是以AAC的形成存在,但流行音乐大多以mp3的格式传播,因此需要完成背景音乐替换这个功能,其中的一个步骤就需要完成mp3转aac这样的一个音频转转码的过程。按照我们以往的经验,转码的大致流程应该是这样的:解封装->提取音频流->解码成PCM->重新编码成AAC流程是这样没错,但是内部的出来细节是怎样的呢?是mp3解码出来后的AVFrame可以通过函原创 2022-04-24 23:56:46 · 949 阅读 · 2 评论 -
FFmpeg连载6-音频重采样
今天我们的实战内容是将音频解码成PCM,并将PCM重采样成特定的采样率,然后输出到本地文件进行播放。什么是重采样所谓重采样,一句话总结就是改变音频的三元素,也就是通过重采样改变音频的采样率、采样格式或者声道数。例如音频A是采样率48000hz、采样格式为f32le、声道数为1,通过重采样可以将音频A的采样率变更为采样率44100hz、采样格式为s16le、声道数为2等。为什么需要重采样一般进行重采样有两个原因,一是播放设备需要,二是音频合并、或编码器等需要。例如有些声音设备只能播放44100hz原创 2022-04-24 23:56:09 · 2108 阅读 · 0 评论 -
FFmpeg连载5-音视频编码
导读在前面的我们使用FFmpeg进行相关实践,对音视视频进行了解封装、解码等相关操作,今天我们继续使用FFmpeg进行实践,使用FFmpeg进行音视频编码。任务一:在前面《FFmpeg连载4-音频解码》我们将音频解码成PCM并输出到本地文件,今天我们就把这个输出到本地的PCM文件进行读取重新编码成AAC音频文件并输出到本地。任务二:在《FFmpeg连载3-视频解码》一节中我们将视频解码成YUV并且输出到本地文件,今天我们读取这个输出的YUV本地文件进行重新编码成H264视频文件并输出到本地。H2原创 2022-04-24 23:55:37 · 776 阅读 · 0 评论 -
FFmpeg连载4-音频解码
导读前面我们介绍了使用FFmpeg解码视频,今天我们使用FFmpeg解码音频。我们的目标将mp4中的音频文件解码成PCM数据,并输出到本地文件,然后使用ffplay播放验证。音频的解码过程就是将经过压缩后的数据重新还原成原始的PCM声音信号的过程。对于音频解码所用到的API和视频解码是一样的。PCM基础知识PCM是指未经过压缩的原始声音脉冲信号数据,它主要通过采样率、采样格式(比如每个采样点是8位、16位、32位等)、声道数来描述。在FFmpeg中有两种表示PCM数据包的模式,分别是planer和原创 2022-04-24 23:54:34 · 791 阅读 · 1 评论 -
FFmpeg连载3-视频解码
导读在前面我们介绍了FFmpeg的解封装,并且实现了提取视频文件中的音频流和视频流单独输出,使用ffplay播放验证,今天我们使用FFmpeg解码视频流,将视频解码为YUV并输出到文件,然后使用ffplay播放YUV图像。关于YUV的相关知识,之前笔者也有过一些笔记,但是写的比较简单,大家可以网上找找更加详细的资料:音视频基础知识-YUV图像关于使用FFmpeg进行视频解码的文章,之前也写过类似的文章《Android使用ffmpeg解码视频为YUV》但是在这篇文章中有一个错误的点就是写入的YUV原创 2022-04-21 00:32:09 · 484 阅读 · 0 评论 -
FFmpeg连载2-分离视频和音频
前言前面我们搭建好了FFmpeg的开发环境,今天我们就来小试牛刀,使用FFmpeg库对mp4文件进行解封装,提取mp4中的视频流和音频流输出到单独的输出文件中。关于FFmpeg开发环境搭建可以看我之前的文章:FFmpeg连载1-开发环境搭建所谓的分离视频和音频是我们通俗的说法,官方的说法叫解封装。与解封装对应的叫封装或复用器,也就是将多个视频流或音频流合并成一个多媒体文件就叫封装。API及数据结构介绍在FFmpeg中解封装的大致流程如下图所示:在这里需要注意的一个点是av_find_best_原创 2022-04-21 00:31:13 · 1905 阅读 · 0 评论 -
FFmpeg连载1-环境搭建
前言之前笔者从事安卓开发的时候想要学习音视频实践,脑子里面想的是要是有专门针对安卓开发的FFmpeg教程就好了。慢慢地发现这个想法很不靠谱,因为那时关于音视频的相关教程本来就少,如果还要是针对安卓的就凤毛麟角了。后来为了学习FFmpeg,笔者也是断断续续的,从音视频的基础资料开始,从FFmpeg编译到实践,希望通过自己的学习可以一点一点地揭开FFmpeg的神秘面纱,直到今天笔者只敢说仅是音视频开发大军中的一个入门新手而已,虽说自己摸索挺久,但依旧难以进阶,我想其中有两个主要的原因,一是缺少仙人指路,二原创 2022-04-21 00:30:30 · 588 阅读 · 0 评论