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

标签 c video ffmpeg libavformat

我正在尝试使用 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/

相关文章:

c - 如何在结构中为 c 中的字符串创建内存分配?

带有网络摄像头输入和立体输出的 ffmpeg

ffmpeg - 是否有一个 ffmpeg 标志不要求覆盖但在最后添加一个数字?

audio - ffmpeg - 我可以将音频 channel 绘制为图像吗?

c - ffmpeg 中的 av_freep 如何工作?

计算 float 的位数

c - 从 C 语言的输入文件中读取 CJK 字符

c - 在 C 中解析 stdin 会导致段错误

iOS10 应用程序已崩溃,因为它试图访问隐私敏感数据

video - 未对齐的内存访问