gpt4 book ai didi

ffmpeg - 如何配置 AVStream 以使用 FFmpeg 写入 29.97FPS 文件

转载 作者:行者123 更新时间:2023-12-04 22:59:34 24 4
gpt4 key购买 nike

我正在尝试使用 ffmpeg 编写 mkv 文件,以 FFV1 和 NTSC 格式的 FLAC 进行编码,但 VLC 和媒体信息中显示的帧速率不正确。

以下是我创建和配置输出格式上下文的方法:

AVOutputFormat  *outputFormat = av_guess_format("matroska", NULL, NULL);

//Allocate an AVFormatContext for an output format.
int err = avformat_alloc_output_context2(&_formatContext, outputFormat, NULL, filename);

//Specify the codec of the outputFormat
_formatContext->oformat->video_codec = _videoCodecContext->codec_id;

//Create AVStream
AVStream *videoStream = avformat_new_stream(_formatContext, NULL);

//FrameDuration.value : 1001, FrameDuration.timescale : 30000
videoStream->time_base = (AVRational){ (int)_frameDuration.value, (int)_frameDuration.timescale }; //1001 30000

//Copy video stream parameters to the muxer
err = avcodec_parameters_from_context(videoStream->codecpar, _videoCodecContext);

//Open file for writing
err = avio_open(&_formatContext->pb, filename, AVIO_FLAG_WRITE);

if (err >= 0) {
//Write header
err = avformat_write_header(_formatContext, &options);
}

在写数据包之前,我用它来将 PTS 转换为流 time_base
// Rescale output packet timestamp values from codec to stream timebase
av_packet_rescale_ts(inAVPacket, *inTimeStamp, [outputStream stream]->time_base);

问题是 avformat_write_header 方法正在将流 time_base 从 30000/1001 更改为 1/1000,因此 PTS 精度降低。在 VLC 检查器中,显示的帧速率为 1000 fps,在 MediaInfo 中为 30.033 fps。

文件播放正常,视频/音频同步正常。

是否可以在其他地方指定文件帧速率?
或者在调用 avformat_write_header 时避免更改 time_base 的解决方法?

最佳答案

设置 avg_frame_rate 可以解决问题...

videoStream->avg_frame_rate = _videoCodecContext->framerate;

关于ffmpeg - 如何配置 AVStream 以使用 FFmpeg 写入 29.97FPS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50330557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com