24.Eclipse下Ndk开发_项目结构重构(ffmpeg音视频同步播放)

简介: 使用生产者消费者模式重构项目,实现音视频同步播放音视频同步涉及到的知识1.IPB帧a) I帧:关键帧,I 帧图像采用帧内编码方式,帧内压缩,包含完整的画面b) P帧:差别帧,与上一个关键帧的差别,需要缓存上一帧才能得到完整的画面c) B帧:双...

使用生产者消费者模式重构项目,实现音视频同步播放

音视频同步涉及到的知识

1.IPB帧

a) I帧:关键帧,I 帧图像采用帧内编码方式,帧内压缩,包含完整的画面
b) P帧:差别帧,与上一个关键帧的差别,需要缓存上一帧才能得到完整的画面
c) B帧:双向差别帧,与前后两帧的差别,需要缓存上一帧和下一帧 才能得到完整画面,P 帧和 B 帧图像采用帧间编码方式

2.如何判断帧的类型

AVFrame->pic_type
AVPacket->flags & AV_PKT_FLAG_KEY
AI 代码解读

3.DTS和PTS

DTS:Decoding Time Stamp 解码时间戳
PTS:Presentation Time Stamp 显示时间戳
AI 代码解读

DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像

音视频流中的每一帧都有时间相关的信息,其中PTS是播放时间,DTS是解码时间。音频的PTS和DTS是一致的,而某些视频各种中可能会存在DTS和PTS不一致的帧,我们这里主要通过PTS来控制播放时间。对解码后的AVFrame使用av_frame_get_best_effort_timestamp可以获取PTS。

为什么说音频的PTS和DTS是一致的,而某些视频各种中可能会存在DTS和PTS不一致的帧?当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,解码顺序和播放顺序就不一致了,原因在于B 帧图像采用双向时间预测,采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致,顺序被打乱。所以视频中可能存在不一致的情况,而音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的

4.FFmpeg中的时间单位

time_base 时间单位(时间基)
不同的结构体又不同的时间单位,AVStream stream中
time = stream->duration
stream->time_base

5.音视频同步的三种方案

a) 音频同步视频
b) 视频同步音频
c) 标准时间(同步音频和视频到外部时钟)

目录
打赏
0
0
0
0
24
分享
相关文章
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
463 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
129 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
76 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
294 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
118 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
4月前
|
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
151 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
谷歌推出的Transformer,作为Jetpack Media3架构的一部分,助力开发者实现音视频格式转换与编辑。Media3简化了媒体处理流程,提升了定制性和可靠性。Transformer可用于剪辑、添加滤镜等操作,其示例代码可在指定GitHub仓库中找到。要使用Transformer,需在`build.gradle`中添加相关依赖,并按文档编写处理逻辑,最终完成音视频转换任务。具体步骤包括配置剪辑参数、设置空间效果以及监听转换事件等。
87 0
FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
IDEA/eclipse集成阿里巴巴Java开发规约插件
IDEA/eclipse集成阿里巴巴Java开发规约插件
338 0
IDEA/eclipse集成阿里巴巴Java开发规约插件
MaxCompute安装Eclipse开发插件
为了方便用户使用 MapReduce及UDF的Java SDK进行开发工作,MaxCompute 提供了Eclipse开发插件。该插件能够模拟MapReduce及UDF的运行过程,为用户提供本地调试手段,并提供了简单的模板生成功能。
1024 0
MaxCompute安装Eclipse开发插件

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等