十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GSYVideoPlayer 解码器与编解码配置完全指南:从 .so 编译选型到 FFmpeg 参数调优

GSYVideoPlayer 解码器与编解码配置完全指南:从 .so 编译选型到 FFmpeg 参数调优 GSYVideoPlayer 解码器与编解码配置完全指南从 .so 编译选型到 FFmpeg 参数调优【免费下载链接】GSYVideoPlayerVideo players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, and GIF screenshots, pre-roll and mid-roll ads, multiple simultaneous playback, basic seeking/dragging, volume and brightness adjustment, play-while-cache support项目地址: https://gitcode.com/GitHub_Trending/gs/GSYVideoPlayer本指南围绕 DECODERS_EN.md 展开系统讲解 GSYVideoPlayer基于 ijkplayer底层为 FFmpeg的 .so 解码能力矩阵、标准版与 ex_so 版的能力差异、常用音视频编码的 FFmpeg 编译选项、以及通过setOption(category, name, value)对解码器/播放器进行底层参数调优的完整方法论。读完本文你将能判断无声有画/有画无声类播放问题的根因、按需裁剪或扩展自己的 .so 解码能力并利用VideoOptionModel精确控制 FFmpeg 的解封装、解码、缩放与播放行为。一、背景为什么有声音没画面或反过来GSYVideoPlayer 的.so是基于 ijkplayer 编译的而 ijkplayer 又基于 FFmpeg。这意味着解码能力、封装格式支持、网络协议支持全部由编译期configure选项决定而非运行时动态加载。文档首先提醒一个高频困惑mp4 不是视频编码而是视频容器。H264/H263 才是视频编码AAC 是音频编码。播放器需要解封装器demuxer 解码器decoder协同工作容器containermp4 / flv / mkv / avi / ts由 demuxer 解析出音视频流视频编码H.264 / H.265(HEVC) / VP8 / VP9 / MPEG-4由 video decoder 解码出画面音频编码AAC / MP3 / FLAC / Vorbis / AC3由 audio decoder 解码出声音。因此出现有声音没画面多半是视频解码器未编译进 .so例如只有--enable-decoderaac而没有对应视频解码器有画面没声音则相反。此外 DEMO 中部分列表启用了静音模式属于正常现象排查时应先排除。二、标准版 .so 与 ex_so能力边界与差异出于.so体积考虑项目普通编译的 .so 只支持常用视频编码。仓库中实际提供了两条编译配置基线配置文件定位标准版litemodule-lite.sh常用格式体积优先增强版lite-moremodule-lite-more.sh在标准版基础上扩展更多解码/封装/协议对照两份配置可以看出标准版的核心能力均通过--disable-decoders后按需--enable-decoder打开视频解码aac、h264、hevc、vp8、vp9、flv、mp3*、vp6f、flacmodule-lite.sh第 72-82 行解封装aac、concat、data、flv、hls、live_flv、mov、mp3、mpegps、mpegts、mpegvideo、flac、hevc、webm_dash_manifest第 92-105 行解析器aac、aac_latm、h264、flac、hevc第 109-113 行网络协议async、ffrtmphttp、rtmp、rtmpt第 134-151 行其余协议显式 disable。而ex_somodule-lite-more.sh在标准版基础上新增了解码器h263、h263i、h263p、mpeg4、mjpeg、pcm_alaw第 83-88 行解封装新增mpeg4、rtp、sdp、rtsp、mjpeg、avi第 113-118 行解析器新增mpeg4、mpeg4video、mpegvideo第 127-129 行协议层新增concat协议与crypto协议第 154-155 行对应文档所述 ex_so adds support for mpeg, concat protocol, and crypto protocol——这意味着 ex_so 支持 mp4 分段拼接、加密流HLS AES-128 等等标准版不具备的能力。注意module-lite.sh中concat、crypto协议是被--disable-protocolconcat、--disable-protocolcrypto明确关闭的第 137-138 行而module-lite-more.sh用--enable-protocol打开这就是两个版本在协议能力上的核心差异。使用建议仅播放常见 H.264/AAC 点播内容 → 标准版足够包体最小需要 MPEG-4、H.263、RTSP、AVI、MJPEG 或 HLS 加密/拼接 → 切换依赖gsyVideoPlayer-ex_so仓库中gsyVideoPlayer-ex_so/已预置五套 ABI 的 so仍不满足 → 重新编译 ijkplayer 源码自行修改配置后编译.so并替换项目中的 so。三、如何重编译 .so 并替换当标准版与 ex_so 都无法覆盖需求时可自行重编译获取 ijkplayer 源码GSYVideoPlayer 本身依赖 ijkplayer 编译体系参照仓库根目录的 module-lite.sh 或 module-lite-more.sh 复制一份改成你自己的module.sh修改其中的--enable-*/--disable-*选项详见第四、五节按 ijkplayer 的编译流程compile-ijk.sh系列即首页所述编译 HTTPS 的 so 流程交叉编译出各 ABI 的.so将生成的libijkffmpeg.so、libijkplayer.so、libijksdl.so替换到对应架构模块如 gsyVideoPlayer-armv7a/src/main/jniLibs/armeabi-v7a/、gsyVideoPlayer-armv64/src/main/jniLibs/arm64-v8a/中。关键约束文档明确强调替换的.so版本必须与 IJK 的 Java 版本一致否则可能出现 JNI 符号不匹配、崩溃或解码异常。仓库的 patch 目录16kpatch/还提供了针对不同 NDK/FFmpeg 版本的增量补丁如ndk_r22_ffmpeg_n4.3_ijk.patch说明 .so 的编译与 Java 层强绑定自行编译时务必对齐版本。四、常用音频格式的 FFmpeg 编译选项速查以下配置片段可直接追加到module.sh的COMMON_FF_CFG_FLAGS中。注意绝大多数编码器/解码器默认是被 disable 的必须显式--enable且部分格式需要外部库如 libmp3lame、libfdk_aac 等。4.1 MP3--enable-libmp3lame --enable-decodermp3 --enable-demuxermp3 --enable-muxermp3 --enable-encoderlibmp3lame4.2 VorbisOgg--enable-libvorbis --enable-parservorbis --enable-encodervorbis --enable-decodervorbis --enable-encoderlibvorbis --enable-decoderlibvorbis --enable-muxerogg --enable-demuxerogg4.3 WAV含 PCM 系列--enable-libwavpack --enable-muxerwav --enable-demuxerwav --enable-decoderwavpack --enable-encoderwavpack --enable-decoderwav --enable-encoderwav --enable-encoderpcm_s16le --enable-decoderpcm_s16le --enable-encoderpcm_u8 --enable-decoderpcm_u8 --enable-muxerpcm_u8 --enable-demuxerpcm_u84.4 AACAAC 的软件实现与外部库实现可同时开启播放时按可用性选择--enable-libvo-aacenc --enable-libfdk_aac --enable-libfaac --enable-parseraac --enable-encoderaac --enable-decoderaac --enable-encoderlibfaac --enable-encoderlibvo_aacenc --enable-encoderlibaacplus --enable-encoderlibfdk_aac --enable-decoderlibfdk_aac --enable-demuxeraac --enable-muxeradts其中--enable-muxeradts是 AAC 的 ADTS 流封装libfdk_aac是公认质量较高的 AAC 编码器但属于非自由许可证需注意--disable-nonfree与它的冲突module-lite.sh中默认--disable-nonfree。4.5 MP2--enable-encodermp2 --enable-decodermp2 --enable-muxermp2 --enable-decodermp2float --enable-encodermp2fixed4.6 FLAC--enable-encoderflac --enable-decoderflac --enable-demuxerflac --enable-muxerflac --enable-parserflac4.7 JPEG/PNG 等图片编解码--enable-encoderjpeg2000 --enable-encodermjpeg --enable-encoderljpeg --enable-encoderjpegls --enable-decoderjpeg2000 --enable-decoderjpegls --enable-decodermjpeg --enable-decodermjpegb --enable-muxermjpeg --enable-demuxermjpeg --enable-encoderpng --enable-decoderpng --enable-parserpng仓库module-lite.sh中默认仅保留--enable-encoderpng第 68 行如需截屏、缩略图等场景可按需补全。4.8 缩放scale支持--enable-swscale --enable-swscale-alpha --enable-filterscale注意module-lite.sh默认--disable-swscale-alpha第 19 行且--disable-filters第 159 行若需 RGBA 缩放或滤镜需在此处放开。4.9 AC3 / E-AC3--enable-encoderac3 --enable-decoderac3 --enable-encoderac3_fixed --enable-decoderatrac3 --enable-decoderatrac3p --enable-encodereac3 --enable-decodereac3 --enable-muxerac3 --enable-demuxerac3 --enable-muxereac3 --enable-demuxereac34.10 WMA / WMV 系列--enable-decoderwmalossless --enable-decoderwmapro --enable-encoderwmav1 --enable-decoderwmav1 --enable-encoderwmav2 --enable-decoderwmav2 --enable-decoderwmavoice --enable-demuxerxwma --enable-demuxeravi --enable-muxeravi --enable-demuxerasf --enable-muxerasf --enable-encoderwmv1 --enable-decoderwmv1 --enable-encoderwmv2 --enable-decoderwmv2 --enable-decoderwmv3 --enable-decoderwmv3_crystalhd --enable-decoderwmv3_vdpau --enable-decoderwmv3image4.11 FFmpeg 编码/解码/容器全貌FFmpeg 支持的编码器、解码器、解封装器、封装器、协议列表可通过以下命令查看./configure --list-encoders ./configure --list-decoders ./configure --list-muxers ./configure --list-demuxers ./configure --list-parsers ./configure --list-protocols仓库 img/code/ 下的截图即为这些列表的真实输出示例如 code01.jpg 为编码器列表code02.jpg 为解码器列表展示了 FFmpeg 对 AAC、H.264、MPEG-4、VP8/VP9、FLAC 等常见格式及大量小众格式的支持范围。实际能用的子集取决于你的module.sh如何裁剪。五、运行时参数调优setOption 与 VideoOptionModel编译期决定能解什么运行期则可精细控制怎么解。GSYVideoPlayer 通过IjkMediaPlayer.setOption(int category, String name, long value)将选项下发到 FFmpeg/ijkplayer 底层。5.1 参数三要素文档对三个参数给出了精确定义category选项类别。name与value实际以 KV 对map方式存储category即该 map 的名字决定name/value的取值表name选项名称即 KV 对中的 Keyvalue选项值即 KV 对中的 Value。5.2 category 的四个取值源自 IjkMediaPlayer.javapublic static final int OPT_CATEGORY_FORMAT 1; // 对应 libavformat解封装/封装层 public static final int OPT_CATEGORY_CODEC 2; // 对应 libavcodec编解码层 public static final int OPT_CATEGORY_SWS 3; // 对应 libswscale像素缩放层 public static final int OPT_CATEGORY_PLAYER 4; // 对应 ijkplayer 播放器层5.3 选项表的结构解读无论哪一层底层选项表都是同一结构来自 FFmpeg 的AVOption数组{name, help, offset, type, default_val, min, max, flags, unit}其中name即 Java 层setOption(category, name, value)传入的namemin与max即value的合法取值范围flags中的D/E/V/A/S表示该选项作用于解码(Demuxer/Decoder)/编码(Encoder)/视频(Video)/音频(Audio)/字幕(Subtitle)哪个方向。Java 层只有两种 setOption 重载long 与 String因为 C 侧所有非 String 类型都被统一封装为 long——这也是VideoOptionModel区分VALUE_TYPE_INT与VALUE_TYPE_STRING的原因。5.4 四类 category 的典型选项OPT_CATEGORY_FORMAT解封装层参考 libavformat/options_table.hname含义取值范围/取值probesize探测文件格式读取的字节数默认 500000032 ~ INT64_MAXanalyzeduration探测输入所分析的最大时长微秒默认 00 ~ INT64_MAXfflags解封装标志位可组合flush_packets/genpts/fastseek/nobuffer/discardcorrupt等FLAGSnobuffer减少可选缓冲引入的延迟直播低延迟常用CONSTfflags 子项fastseek快速但不精确的 seekCONSTfflags 子项seek2any允许 seek 到非关键帧0/1rtbufsize实时帧缓冲最大内存字节默认 3041280max_ts_probe等待首个时间戳前最多读取的包数默认 50protocol_whitelist允许使用的协议白名单StringOPT_CATEGORY_CODEC编解码层参考 libavcodec/options_table.hname含义取值范围threads解码线程数0 为自动检测默认 10 ~ INT_MAXlowres按 1/2、1/4、1/8 分辨率降级解码0、1、2、3skip_frame跳过帧nokey仅解关键帧可大幅提速none/default/noref/bidir/nokey/nointra/allflags解码标志如truncated容忍截断输入流、low_delayFLAGSerr_detect错误检测严格度explode遇到小错即中止crccheck/bitstream/buffer/explode等profile编解码 profile如aac_he、mpeg4_sp、main10CONSTlevel编解码 levelCONSTOPT_CATEGORY_SWS缩放层参考 libswscale/options.cname含义取值sws_flags缩放算法fast_bilinear/bilinear/bicubic/neighbor/area/gauss/sinc/lanczos/spline默认bicubicsrcw/srch/dstw/dsth源/目标宽高默认 161 ~ INT_MAXsrc_format/dst_format源/目标像素格式PIXEL_FMTsrc_range/dst_range是否全范围full range0/1sws_dither抖动算法auto/bayer/ed/a_dither/x_dithergamma是否进行 gamma 校正缩放0/1OPT_CATEGORY_PLAYERijkplayer 层参考 ijkmedia/ijkplayer/ff_ffplay_options.h这是 Android 端最高频使用的一类仓库 IjkPlayerManager.java 中即通过它开启硬解与变速name含义默认/范围mediacodec启用 H.264 MediaCodec 硬解0/1mediacodec-auto-rotate硬解按 meta 自动旋转0/1mediacodec-handle-resolution-change硬解自动处理分辨率变化0/1mediacodec-hevc启用 HEVC 硬解0/1mediacodec-mpeg2/mediacodec-mpeg4启用 MPEG2/MPEG4 硬解0/1soundtouch启用 SoundTouch 变速不变调0/1opensles启用 OpenSL ES 音频输出0/1framedropCPU 过慢时丢帧默认 0-1 ~ 120infbuf不限制输入缓冲实时流用0/1packet-buffering停顿后缓冲足够包再输出0/1sync-av-start音视频起始时间同步0/1enable-accurate-seek启用精确 seek0/1accurate-seek-timeout精确 seek 超时默认MAX_ACCURATE_SEEK_TIMEOUTstart-on-preparedprepared 后自动播放1video-pictq-size视频帧队列上限默认VIDEO_PICTURE_QUEUE_SIZE_DEFAULTmax-fps大于该帧率时丢帧默认 31-1 ~ 121overlay-formatoverlay 渲染格式fcc-_es2/fcc-i420/fcc-yv12/fcc-rv16/fcc-rv24/fcc-rv32默认 RV32volume启动音量0 最小 100 最大默认 100loop循环播放次数默认 1find_stream_info用启发式读流补全信息1async-init-decoder异步创建解码器0/1video-mime-type默认视频 MIME 类型String5.5 仓库中的真实调用链硬解开启IjkPlayerManager.java第 76-86 行当GSYVideoType.isMediaCodec()为真时依次setOption(OPT_CATEGORY_PLAYER, mediacodec, 1)、mediacodec-auto-rotate1、mediacodec-handle-resolution-change1若开启智能硬解还追加mediacodec-auto-fallback1变速不变调第 156-166 行setSpeed时构造VideoOptionModel(OPT_CATEGORY_PLAYER, soundtouch, 1)加入选项列表自定义选项下发第 344-356 行initIJKOption遍历ListVideoOptionModel按VALUE_TYPE_INT/VALUE_TYPE_STRING分别调用对应的setOption(category, name, long|String)重载。VideoOptionModelgsyVideoPlayer-base/src/main/java/com/shuyu/gsyvideoplayer/model/VideoOptionModel.java提供了两个构造函数new VideoOptionModel(int category, String name, int value) // 数值型选项 new VideoOptionModel(int category, String name, String value) // 字符串型选项如 protocol_whitelist、iformat使用示例ListVideoOptionModel list new ArrayList(); list.add(new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, fflags, nobuffer)); list.add(new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_CODEC, skip_frame, 4)); // AVDISCARD_NONKEY list.add(new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, enable-accurate-seek, 1)); GSYVideoManager.instance().setOptionModelList(list);说明skip_frame等常量取值在 FFmpegavdiscard枚举中的顺序为none0, default1, noref2, bidir3, nokey4, nointra5, all6此处4即仅解码关键帧适合试播/预览场景。六、实战排查解码能力问题定位流程结合文档与仓库代码推荐按以下顺序排查播放异常确认容器 vs 编码先用 FFprobe/mediainfo 之类工具或观察 URL 后缀与流信息区分容器格式与音视频编码切忌把 mp4 当编码看待核对 .so 能力对照 module-lite.sh 与 module-lite-more.sh 检查目标格式的 decoder/demuxer/parser 是否 enable确认硬解路径若开启 MediaCodec 硬解检查对应mediacodec-hevc、mediacodec-mpeg2等是否开启设备不支持时考虑mediacodec-auto-fallback或关闭硬解走 FFmpeg 软解确认 DEMO 静音先排除 DEMO 列表本身启用的静音模式正常现象仍无法解码按第三节流程重编 .so 并保证与 IJK Java 版本一致。七、版本与适用前提本文所有编译选项与AVOption表均以当前仓库module-lite.sh/module-lite-more.sh及文档引用的 FFmpeg对应 ijkplayer 内置版本为准不同 FFmpeg 版本的选项名、默认值可能存在差异标准版 .so 已预置在 gsyVideoPlayer-armv7a、gsyVideoPlayer-armv64、gsyVideoPlayer-x86、gsyVideoPlayer-x86_64 等模块ex_so 预置在 gsyVideoPlayer-ex_so含 arm64-v8a / armeabi / armeabi-v7a / x86 / x86_64 五套 ABI接入时按架构选择对应模块即可自行重编译时建议参考 16kpatch/ 下的补丁与 doc/BUILD_SO.md 了解 NDK/FFmpeg 版本对齐细节确保 .so 与 Java 层 ijkplayer 版本严格匹配。【免费下载链接】GSYVideoPlayerVideo players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, and GIF screenshots, pre-roll and mid-roll ads, multiple simultaneous playback, basic seeking/dragging, volume and brightness adjustment, play-while-cache support项目地址: https://gitcode.com/GitHub_Trending/gs/GSYVideoPlayer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表