我正在尝试使用 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
.因此,即使及时压缩音频数据包的时间戳,解码器也会等待当前数据包播放完毕。如果下一个数据包的播放延迟超过了播放器使用的任何阈值或同步要求,则预计它会被丢弃。
关于c - time_base 适用于视频但对音频有不良影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69671344/