我目前在用FFmpeg库实现视频播放等功能,在实现内嵌字幕播放的时候遇到,图片基字幕播放时获取不到字幕持续时间Packet.duration和subtitle.end_display_time , subtitle.start_display_time等值都是0或者-1
if (mSubtitleInfo.isEnabled && mPacket.stream_index == mSubtitleStream->index) {
AVSubtitle subtitle;
int gotSubtitle = 1;
if (avcodec_decode_subtitle2(mSubtitleCodecContext, &subtitle, &gotSubtitle, &mPacket) < 0) {
LOG("Error decoding subtitle \n");
return false;
}
LOG("subtitle gotSubtitle:%d pts:%d duration:%d startTime:%d endTime:%d time_base.num:%d time_base.den:%d\n", gotSubtitle, mPacket.pts, mPacket.duration, subtitle.start_display_time, subtitle.end_display_time, mSubtitleStream->time_base.num, mSubtitleStream->time_base.den);
mSubtitleInfo.subtitleType = subtitle.format;
// 处理解码后的字幕
for (int i = 0; i < subtitle.num_rects; i++) {
if (subtitle.format != 0) {
if (textSubtitleCallbackFunc != nullptr) {
char* bytes;
if (subtitle.rects[i]->ass != NULL) bytes = subtitle.rects[i]->ass;
else if (subtitle.rects[i]->text != NULL) bytes = subtitle.rects[i]->text;
mSubtitleInfo.pts = mPacket.pts;
mSubtitleInfo.duration = mPacket.duration;
if (bytes != NULL) textSubtitleCallbackFunc(bytes, mPacket.pts, mPacket.duration);
}
}
else {
AVSubtitleRect* sub_rect = subtitle.rects[i];
int dst_linesize[4];
uint8_t* dst_data[4];
av_image_alloc(dst_data, dst_linesize, sub_rect->w, sub_rect->h, AV_PIX_FMT_RGBA, 1);
SwsContext* swsContext = sws_getContext(sub_rect->w, sub_rect->h, AV_PIX_FMT_PAL8,
sub_rect->w, sub_rect->h, AV_PIX_FMT_RGBA,
SWS_BILINEAR, nullptr, nullptr, nullptr);
sws_scale(swsContext, sub_rect->data, sub_rect->linesize, 0, sub_rect->h, dst_data, dst_linesize);
sws_freeContext(swsContext);
mSubtitleInfo.pts = mPacket.pts;
if (subtitle.end_display_time - subtitle.start_display_time > 0)
mSubtitleInfo.duration = (subtitle.end_display_time - subtitle.start_display_time);
else
mSubtitleInfo.duration = -1;
if (imgSubtitleCallbackFunc != nullptr) {
imgSubtitleCallbackFunc(dst_data[0], sub_rect->w, sub_rect->h, mSubtitleInfo.pts, mSubtitleInfo.duration);
}
for (size_t j = 0; j < 4; j++)
{
av_freep(&dst_data[j]);
}
}
}
avsubtitle_free(&subtitle);