ffmpegh264android
Ⅰ RTMP视频流格式解析
RTMP视频流格式深入解析
RTMP视频流格式与FLV有相似之处,主要由Video Tag和Audio Tag的tag data构成,不同之处在于RTMP在发送时不包含tag header和pre tag length。FLV文件结构包括一个FLV Header,由Header和多个tag组成,tag类型包括Video、Audio和Script。
FLV Header包含了文件的基本信息,而Body部分由预先定义的长度和tag序列构成。视频tag的数据格式中,第一个字节用于标识帧类型和解码器ID;音频tag则通过第一个字节确定音频格式、采样率和类型。例如,音频数据的第一个byte会显示音频格式的详细信息,视频数据则用于描述视频帧类型和解码器标识。
RTMP抓包的视频流更直接,以H264编码为例,当AVC packet类型为AVC Sequence Header时,紧随其后的是AVCDecoderConfigurationRecord的内容,接着是NALU(Network Abstraction Layer Unit)的数据,其中包含H264编码的具体信息,如SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)的结构。
对于实际应用,例如将RTSP回调的H264裸流转换并通过RTMP协议传输,涉及到编码数据的处理和格式转换,这通常在编码器或服务器端进行。如果你对这方面感兴趣,可以参考以下资源:
- 免费学习地址:【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
- 技术资料分享:C++音视频学习资料包,包含FFmpeg、WebRTC、RTMP、HLS、RTSP、FFplay、SRS等技术,点击671977938加入群组获取免费资源。
Ⅱ Android 编译 FFmpeg 6.0 - 支持MediaCodec编解码
在Android上编译FFmpeg 6.0版本,已成功集成MediaCodec编解码支持,包括H264和H265编码。以下是编译和集成的详细步骤:
首先,使用Macos 13.2的GCC、Cmake和NDK 21的交叉编译环境,构建了x264、mp3lame、fdk-aac和opencore-amr等第三方库。FFmpeg 6.0版本默认支持MediaCodec硬件加速,无需额外开启,加速选项包括在内。
配置编译时,选择静态链接库,禁用avdevice和postproc模块,以减少生成的.a文件数量。为了方便,可以编写脚本自动化configure和make命令。编译过程中,遇到x264的pkg-config问题,需要指定其位置。
通过ld工具,将所有静态库合并成一个libffmpeg-org.so文件,便于使用。合并配置中需注意使用libgcc_real.a,而不是libgcc.a,以适应NDK 21环境。编译完成后,将库文件和头文件添加到Android项目中,配置CmakeLists.txt并实现FFmpegCmd类以调用MediaCodec功能。
开源库FFmpegCommand提供了基础的音视频处理功能,包括FFmpegUtils命令和自定义MediaCodec操作的示例。在实际测试中,使用MediaCodec编码的效率更高,建议优先使用。
总的来说,FFmpeg 6.0的MediaCodec集成已经成功,可用于Android项目的音视频编解码。通过简单的配置和集成,即可享受MediaCodec带来的性能优势。