android mediacodec---h264转mpeg4

android mediaCodec h264 转 MP4_mob64ca12ee66e3的技术博客_51CTO博客

如果你也想自学Android,可以关注我。我会把踩过的坑分享给你,相关的教程以及配套的讲解 ,分享给大家:

使用Android MediaCodec将H.264转换为MP4
在现代多媒体应用中,视频格式的转换是一项常见而重要的任务。尤其是在Android开发中,使用MediaCodec进行视频编解码,特别是将H.264格式转换为MP4格式,不仅能够提高视频的兼容性,还能优化视频的存储和播放。本文将详细阐述如何使用Android中的MediaCodec实现这一过程,并提供相关的代码示例。

1. 什么是H.264和MP4?
H.264是当今广泛使用的一种视频编码标准,因其高效的压缩算法而被广泛应用于DVD、蓝光和各种网络视频流。MP4是一种流行的容器格式,可以存储视频、音频、字幕等多种数据,因而成为了各种设备支持的主流格式。

2. Android中的MediaCodec介绍
MediaCodec是Android提供的一套API,允许我们对音频和视频进行编解码。使用MediaCodec可以硬件加速编解码流程,提升性能,降低功耗。Android的MediaMuxer则可以用来将编解码后的数据打包成MP4文件。

3. 转换流程概述
以下是使用MediaCodec将H.264转换为MP4的基本流程:
Android H.264转MP4流程
4. 代码实现
接下来,我们将实现上述流程的具体代码示例。

4.1 初始化和解码H.264流
首先,我们需要创建一个MediaCodec解码器,来解码H.264格式的视频流。

String mimeType = "video/avc"; // H.264 codec
MediaCodec decoder = MediaCodec.createDecoderByType(mimeType);
MediaFormat format = MediaFormat.createVideoFormat(mimeType, width, height);
decoder.configure(format, surface, null, 0);
decoder.start();


4.2 编码YUV数据
解码完成后,我们接下来需要配置一个编码器,将YUV格式编码成H.264格式。

MediaCodec encoder = MediaCodec.createEncoderByType(mimeType, MediaFormat.MIMETYPE_VIDEO_AVC, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface, null);
MediaFormat encodeFormat = MediaFormat.createVideoFormat(mimeType, outputWidth, outputHeight);
encoder.configure(encodeFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
encoder.start();


4.3 写入MP4文件
使用MediaMuxer将编码后的视频流封装成MP4格式。

MediaMuxer muxer = new MediaMuxer(outputFilePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
int trackIndex = muxer.addTrack(encoder.getOutputFormat());
muxer.start();

while (true) {
    // 提取编码后的数据并写入MP4
    int outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, timeoutUs);
    if (outputBufferIndex >= 0) {
        ByteBuffer outputBuffer = encoder.getOutputBuffer(outputBufferIndex);
        muxer.writeSampleData(trackIndex, outputBuffer, bufferInfo);
        encoder.releaseOutputBuffer(outputBufferIndex, false);
    }
}
muxer.stop();
muxer.release();


4.4 释放资源
在完成转换后,请务必释放所有的资源。

decoder.stop();
decoder.release();
encoder.stop();
encoder.release();
在Ubuntu 22.04下,你可以使用以下脚本来编译FFmpeg用于Android API 10: ```bash #!/bin/bash # 设置 Android NDK 路径 export NDK=/path/to/android-ndk # 设置编译工具链和目标架构 export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64 export TARGET_ARCH=arm # 设置 Android API 级别 export API_LEVEL=10 # 设置输出目录 export OUTPUT_DIR=/path/to/output # 添加工具链到环境变量 export PATH=$TOOLCHAIN/bin:$PATH # 设置编译参数 export CC=$TOOLCHAIN/bin/$TARGET_ARCH-linux-android$API_LEVEL-clang export CXX=$TOOLCHAIN/bin/$TARGET_ARCH-linux-android$API_LEVEL-clang++ export AR=$TOOLCHAIN/bin/$TARGET_ARCH-linux-android-ar export LD=$TOOLCHAIN/bin/$TARGET_ARCH-linux-android-ld export AS=$TOOLCHAIN/bin/$TARGET_ARCH-linux-android-as # 设置编译选项 export CFLAGS="-fPIE -fPIC" export LDFLAGS="-pie" # 设置 FFmpeg 配置选项 export CONFIGURE_FLAGS="--target-os=android --arch=$TARGET_ARCH --enable-neon --enable-hwaccel --enable-jni --enable-mediacodec --enable-decoder=h264_mediacodec --enable-decoder=hevc_mediacodec --enable-decoder=mpeg4_mediacodec --enable-decoder=vp8_mediacodec --enable-decoder=vp9_mediacodec --enable-decoder=aac --enable-decoder=mp3 --enable-decoder=opus --enable-static --disable-shared" # 进入 FFmpeg 源码目录 cd /path/to/ffmpeg-source # 清理之前的编译结果 make clean # 执行配置命令 ./configure $CONFIGURE_FLAGS --prefix=$OUTPUT_DIR # 编译 FFmpeg make -j8 # 安装 FFmpeg 到输出目录 make install ``` 在这个脚本中,你需要根据你的环境配置设置以下变量: - `/path/to/android-ndk`:Android NDK 的路径。 - `/path/to/output`:编译输出目录的路径。 - `/path/to/ffmpeg-source`:FFmpeg 源码的路径。 你可以将以上脚本保存到一个文件(比如 build_ffmpeg.sh),然后在终端中运行该脚本。脚本会设置编译参数和环境变量,并执行编译和安装命令,最终将编译结果安装到指定的输出目录中。 请确保在运行脚本之前已经正确安装了所需的依赖项和工具链,并且替换上述脚本中的路径和变量为适合你的环境的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geniusNMRobot引流专家

你最少得给我一个亿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值