播放8K视频卡顿特别严重 怎么解决
开硬解码了吗
开硬解码了吗
开了 硬解码
@befovy fpsOutput 1.8779342
fpsDecode 4.2328043
videoCachedDuration 1267
audioCachedDuration 0
videoCachedBytes 17072337
audioCachedBytes 0
tcpSpeed 1843592
bitRate 69
seekLoadDuration 0
这是8K 播的时候输出信息
如果媒体文件中包含声音,那ijkplayer 默认是按照声音时钟控制播放进度的。
你给的这里 audioCachedDuration 0 , 看起来是声音数据不够引起的卡顿。
@SrzGitHub
如果媒体文件中包含声音,那ijkplayer默认是按照声音时钟控制播放进度的。
你给的这里
audioCachedDuration 0,看起来是声音数据不够引起的卡顿。@SrzGitHub
应该是高通芯片不支持解码8K 要用三星的 某个芯片 我在另一台支持8K视频播放的设备运行就可以
@befovy 如果媒体文件中包含声音,那ijkplayer默认是按照声音时钟控制播放进度的。
你给的这里audioCachedDuration 0,看起来是声音数据不够引起的卡顿。
@SrzGitHub
应该是高通芯片不支持解码8K要用三星的某个芯片我在另一台支持8K视频播放的设备运行就可以
开启硬解码之后,可以在日志里看是否真的成功启动硬解码器。
ijkplayer 的逻辑是如果启动硬解码器失败,会再次尝试启动ffmpeg 软解码器
开启硬解码之后,可以在日志里看是否真的成功启动硬解码器。
ijkplayer 的逻辑是如果启动硬解码器失败,会再次尝试启动ffmpeg 软解码器
怎么看到开启硬解成功?
我看as的logcat 发现有: IJKMEDIA: ffpipenode_create_video_decoder_from_android_mediacodec: MediaCodec/HEVC is disabled. codec_id:174
@tubeuchiha
那这个是没有成功开启硬解码。
根据这个日志找到代码
if (!ffp->mediacodec_hevc && !ffp->mediacodec_all_videos) {
ALOGE("%s: MediaCodec/HEVC is disabled. codec_id:%d \n", __func__, opaque->codecpar->codec_id);
goto fail;
}
这个选项“ mediacodec-all-videos” 你没打开
手机8k,真的大丈夫吗
@tubeuchiha
那这个是没有成功开启硬解码。根据这个日志找到代码
if (!ffp->mediacodec_hevc && !ffp->mediacodec_all_videos) { ALOGE("%s: MediaCodec/HEVC is disabled. codec_id:%d \n", __func__, opaque->codecpar->codec_id); goto fail; }这个选项“ mediacodec-all-videos” 你没打开
ok ,thanks you。 我发现切换音轨,画面会变的很快播放,一会后(大概有差不多10秒)恢复正常,知道是什么原因吗?
@tubeuchiha
切换音轨由于调用 stream_component_close 旧的音轨,之后再 stream_component_open 另一个音轨。
audioq 和 sampq 都被清空, audio clock 变化大,所以视频画面会快放。
想解决这个问题还得修改源代码,同时解码多个音轨,才能达到你想要的无缝切换。
btw,你可以使用我修改的 ijkplayer https://github.com/befovy/ijkplayer 进行 ndk 断点调试
@tubeuchiha
切换音轨由于调用 stream_component_close 旧的音轨,之后再 stream_component_open 另一个音轨。
audioq 和 sampq 都被清空, audio clock 变化大,所以视频画面会快放。
想解决这个问题还得修改源代码,同时解码多个音轨,才能达到你想要的无缝切换。btw,你可以使用我修改的 ijkplayer https://github.com/befovy/ijkplayer 进行 ndk 断点调试
老司机,你这个链接,是实现了切换音轨无缝切换吗?我看到你添加了 cmake的编译。
@tubeuchiha 没做音轨切换,只是增加了 android ndk cmake 调试
@tubeuchiha 没做音轨切换,只是增加了 android ndk cmake 调试
额,大神,ijkplayer 有没有提供API设置默认播放第一个音轨的呢?
@tubeuchiha 你可以自己修改源代码。
在这里
if (!ffp->audio_disable)
st_index[AVMEDIA_TYPE_AUDIO] =
av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO,
st_index[AVMEDIA_TYPE_AUDIO],
st_index[AVMEDIA_TYPE_VIDEO],
NULL, 0);
@tubeuchiha 你可以自己修改源代码。
在这里```
if (!ffp->audio_disable)
st_index[AVMEDIA_TYPE_AUDIO] =
av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO,
st_index[AVMEDIA_TYPE_AUDIO],
st_index[AVMEDIA_TYPE_VIDEO],
NULL, 0);
@tubeuchiha 你可以自己修改源代码。
在这里if (!ffp->audio_disable) st_index[AVMEDIA_TYPE_AUDIO] = av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO, st_index[AVMEDIA_TYPE_AUDIO], st_index[AVMEDIA_TYPE_VIDEO], NULL, 0);
在哪个文件呢?av_find_best_stream 这个方法是找最好的一条音频流的意思吗?
这段代码只出现了一处,所以我没说在哪个文件。
av_find_best_stream 是你理解的这个意思,具体可以看 ffmpeg 文档。
/**
* Find the "best" stream in the file.
* The best stream is determined according to various heuristics as the most
* likely to be what the user expects.
* If the decoder parameter is non-NULL, av_find_best_stream will find the
* default decoder for the stream's codec; streams for which no decoder can
* be found are ignored.
*
* @param ic media file handle
* @param type stream type: video, audio, subtitles, etc.
* @param wanted_stream_nb user-requested stream number,
* or -1 for automatic selection
* @param related_stream try to find a stream related (eg. in the same
* program) to this one, or -1 if none
* @param decoder_ret if non-NULL, returns the decoder for the
* selected stream
* @param flags flags; none are currently defined
* @return the non-negative stream number in case of success,
* AVERROR_STREAM_NOT_FOUND if no stream with the requested type
* could be found,
* AVERROR_DECODER_NOT_FOUND if streams were found but no decoder
* @note If av_find_best_stream returns successfully and decoder_ret is not
* NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec.
*/
int av_find_best_stream(AVFormatContext *ic,
enum AVMediaType type,
int wanted_stream_nb,
int related_stream,
AVCodec **decoder_ret,
int flags);
@tubeuchiha 你应该 new 一个 issue了,讨论内容已经脱离这个主题了
@tubeuchiha
切换音轨由于调用 stream_component_close 旧的音轨,之后再 stream_component_open 另一个音轨。
audioq 和 sampq 都被清空, audio clock 变化大,所以视频画面会快放。
想解决这个问题还得修改源代码,同时解码多个音轨,才能达到你想要的无缝切换。btw,你可以使用我修改的 ijkplayer https://github.com/befovy/ijkplayer 进行 ndk 断点调试
大神
怎么同时解码多个音轨?
@sun804336516 粗暴直接的做法就是你想同时解码 N 路音轨,就开 N 个 audioq,N 个 sampq,N 个 audio decode thread。
更加优雅的,效率更高的没有仔细考虑过。
按优酷做法,可以音频单独播放,这样视频音频分离没有耦合。视频可以全局时钟同步。
Most helpful comment
开硬解码了吗