Android+FFmpeg+x264重编码压缩你的视频

Android+FFmpeg+x264重编码压缩你的视频

前言

平时我们的手机里面会积攒许多视频,占用了大多的存储空间。使用H.264编码可以在保证视频画面质量的情况下极大的压缩视频的体积。本文开发了一款集成FFmpeg和x264的Android音视频编辑器,帮助大家使用H.264编码重编码压缩Android手机上的视频。

本项目代码在GitHub上公布,并提供已经编译好的Android软件。

开发技术

Android开发相关的技术知识可以直接从Android开发者官网获取。

Android音视频开发相关的知识可以参考Android 音视频开发打怪升级系列文章MediaPipe + FFmpeg生成绿幕视频的另一种方式

本项目的代码借鉴参考许多了文章或者项目的代码,会在文章最后列出,感谢这些作者的无私分享。

Jetpack Compose

Jetpack Compose 是用于构建原生 Android 界面的新工具包,音视频编辑器只有一个Activity,所有的页面都是由Compose函数构建而成,并使用Navigation 组件实现在不同页面中的导航。

NavHost( 复制代码
            navController = homeNavController,
            startDestination = FunctionsCenter.route,
            modifier = Modifier.padding(innerPadding)
        ){
            composable(
                route=FunctionsCenter.route
            ){
              FunctionsCenterScreen()//功能列表页面
            }
            composable(
                route=TasksCenter.route
            ){
                TasksCenterScreen()//任务列表页面
            }
            composable(
                route=UserCenter.route
            ){
                UserCenterScreen()//用户中心页面
            }
            composable(
                route=FileSelection.route
            ){
                FileSelectionScreen()//文件选择器页面
            }
            composable(
                route=ReEncoding.route
            ){
                ReEncodingScreen()//重编码功能页面
            }
            composable(
                route=AudioAndVideoInfo.route
            ){
                AVInfoScreen()//获取音视频信息页面
            }
        }

FFmpeg

FFmpeg是著名的开源多媒体框架,能够解码、编码、转码、复用、解复用、流式传输、过滤和播放人类和机器创建的几乎所有音视频。可以将FFmpeg源代码编译成so库,在Android应用中调用FFmpeg API完成各种音视频编辑功能。

scss 复制代码
//读取视频帧,解码视频帧
av_read_frame(m_format_ctx, m_packet);
avcodec_receive_frame(m_codec_ctx, m_frame);
...
//发送视频帧给编码器,得到编码后的数据
avcodec_send_frame(m_codec_ctx, frame);
avcodec_receive_packet(m_codec_ctx, m_encoded_pkt);

x264

FFmpeg本身并不自带支持H.264编码的编码器,想要在Android手机上实现H.264编码需要借助x264。x264是一个自由软件库和应用程序,用于将视频流编码为H.264/MPEG-4 AVC压缩格式,并根据GNU GPL条款发布,FFmpeg支持调用x264。我们同样将x264源代码编译成so库,与FFmpeg一起在Android手机上完成H.264编码。

ini 复制代码
//指定H264的编码器
m_codec = avcodec_find_encoder(AV_CODEC_ID_H264);

编码视频

在手机上安装好音视频编辑器,选择本机的一个视频文件。

从文件管理器可以看见这个视频文件的大小是42.86MB,我们在音视频编辑器可以看到该视频的分辨率、码率等信息。

我们在音视频编辑器中选中该视频,进行重新编码。

点击重编码后,可以在任务中心看见进度。

任务结束后,我们可以查看重编码后的视频信息。

码率由原来的13236228 bit/s变为8628686 bit/s,从文件管理器可以看见新视频体积为27.73MB,是原来的65%,有效减少视频体积。

结束语

本项目应该支持arm64-v8a的Android 10到Android 14的Android手机,在我自己的x86的Android 10虚拟机和arm64-v8a的Android 14的真机跑通过。

Android 15由于我没有适配 16K Page Size,所以应该是无法在Android 15上运行的。

本项目目前只是为了跑通FFmpeg+Android的全流程,实现了最基本的解码和编码功能,后面会陆续将FFmpeg支持的音视频编辑功能加上去。

本项目应用运行需获取手机文件读写权限和通知权限。文件读写权限用于读取本机音视频文件和生成新的音视频文件,是必需的权限。通知权限主要用于告知用户任务执行进度,是非必需的。

大家可以在GitHub上看见本项目的源码并下载编译好的的安卓应用。

音视频编辑器源码

如果不方便访问GitHub可以通过下面的链接下载编译好的的安卓应用。

音视频编辑器下载

本项目代码写的比较粗糙,如有不对请多多指教。有什么问题或者建议可以在评论区、私信或者邮箱联系我。

参考

1.Android 音视频开发打怪升级系列文章

2.LearningVideo

3.MediaPipe + FFmpeg生成绿幕视频的另一种方式

4.Jetpack Compose Codelabs Android官方示例项目

相关推荐
qingmiaozhuan4 小时前
电脑录屏软件追剧高光截取:FFmpeg帧裁剪与可视化方案对比
ffmpeg·电脑·音视频开发·录屏技术·电脑录屏
码流怪侠18 小时前
StereoCrafter 源码级深度拆解:腾讯如何把 2D 视频“抠“成 3D
github·音视频开发·webvr
字节跳动视频云技术团队4 天前
把 AI 视频的钱花在刀刃上,不是每一刀上
人工智能·音视频开发
大辉狼_音频架构6 天前
第 02 篇:时域的语言 —— 卷积、LTI 系统与冲激响应
算法·音视频开发
大辉狼_音频架构6 天前
第 01 篇:音频采样与量化 —— 从 I2S 帧到奈奎斯特定理
嵌入式·音视频开发
qingmiaozhuan9 天前
区域录屏窗口位移录制框固定?GDI+win32gui动态坐标追踪4种代码方案
音视频开发·录屏工具·录屏技术·电脑录屏
KnowFun11 天前
互动视频的前端实现:有向图建模、分支预加载与尾帧管线
音视频开发
大辉狼_音频架构17 天前
AudioReach Plugin 机制问题解答
嵌入式·音视频开发
大辉狼_音频架构17 天前
AudioReach:Tinyalsa PCM Plugin 机制
嵌入式·音视频开发
老孙讲技术17 天前
凌晨三点报警全乱了:一个 callback 地址,如何把设备托管消息拆成多客户流水线?
物联网·音视频开发