time_base 适用于视频但对音频有不良影响

time_base working for video but undesired effects for audio

我正在尝试使用 ffmpeg c api 更改视频播放速度。到目前为止,除了应用于音频流的时基变化不会加快音频速度外,一切正常。相反,它会切掉部分音频。这大致是我所拥有的:

for (uint64_t i = 0; i < in_ctx->nb_streams; i++) { // Copy over streams and codec parameters
    AVStream* in_stream = in_ctx->streams[i];
    AVStream* out_stream = avformat_new_stream(out_ctx, NULL);

    in_stream->time_base.den += 20000;

    if (!out_stream) {
        return fatal_error();
    }

    avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);
}
if (avio_open(&out_ctx->pb, argv[2], AVIO_FLAG_WRITE) < 0 ||
    avformat_write_header(out_ctx, NULL) < 0) {
    return fatal_error();
}

while (av_read_frame(in_ctx, packet) >= 0) {
    AVStream* in_stream = in_ctx->streams[packet->stream_index];
    AVStream* out_stream = out_ctx->streams[packet->stream_index];

    av_packet_rescale_ts(packet, in_stream->time_base, out_stream->time_base);
    if (av_interleaved_write_frame(out_ctx, packet) < 0) {
        return fatal_error();
    }
}

您必须使用 atempo 过滤器或类似工具来改造音频流。

更改有效时间戳适用于视频,因为帧中的所有像素都应在给定时间戳处绘制。音频数据包是一系列样本。更改数据包时间戳会改变该数据包应该出现的时间,但不会改变播放序列中每个样本所花费的持续时间,即 1/samplerate。因此,即使及时压缩音频数据包的时间戳,解码器也会等到当前数据包播放完毕。如果下一个数据包的播放延迟已超过播放器使用的任何阈值或同步要求,则预计它会被丢弃。