21xrx.com
2024-05-20 20:35:54 Monday
登录
文章检索 我的文章 写文章
ffmpeg SDK输出MP4时长不正确
2023-08-14 19:17:17 深夜i     --     --
ffmpeg SDK MP4 输出 时长 不正确

最近,我在使用FFmpeg SDK将视频转换为MP4格式时遇到了一个令人困惑的问题。尽管我按照文档中提示的方法进行操作,但输出的MP4文件的时长始终不正确。

在我的项目中,我需要将一些视频文件转换为MP4格式,以供后续处理和分析。为了实现这一目标,我选择了使用FFmpeg SDK,这是一个功能强大且广泛使用的多媒体处理工具。

根据官方文档和示例代码,我编写了一个简单的转换程序。我首先使用avformat_open_input()函数打开视频文件,并获取到了AVFormatContext结构体,其中包含了视频的基本信息。然后,我使用av_find_stream_info()函数获取了视频流的详细信息,包括时长、帧率等。

接下来,我创建了一个输出上下文,使用avformat_alloc_output_context2()函数将其绑定到输出的MP4文件上。然后,我使用avio_open()函数打开输出文件,将codec和stream添加到输出上下文,并使用avformat_write_header()函数写入MP4文件的头部信息。

在这一步之后,我通过循环读取视频文件的帧,使用av_interleaved_write_frame()函数将帧写入MP4文件。然后,我再使用av_write_trailer()函数写入MP4文件的尾部信息,并使用avio_close()函数关闭输出文件。

在这一过程中,我没有遇到任何错误或异常。然而,当我尝试用播放器播放输出的MP4文件时,我发现文件的时长与原始视频的时长不一致。这让我感到困惑和困扰。

为了解决这个问题,我回顾了我的代码,并阅读了FFmpeg SDK的文档和源代码。我发现在获取视频时长时,使用了AV_TIME_BASE作为时间基准单位。然而,在写入MP4文件时,我没有对时间基准单位进行转换。

根据文档中的说明,AV_TIME_BASE是微秒级别的计时基准单位。因此,在写入MP4文件时,我应该将原始视频的时长转换为以微秒为单位的时间。经过修改代码并重新编译,我再次进行了转换,并重新生成了MP4文件。

这次,当我使用播放器播放新生成的MP4文件时,发现其时长与原始视频的时长完全一致。我感到非常高兴,因为我成功解决了这个问题。

总之,尽管FFmpeg SDK是一个非常强大且广泛使用的多媒体处理工具,但在使用过程中仍然可能遇到一些问题。在本例中,输出的MP4文件的时长不正确,这可能是由于没有对时间基准单位进行转换所导致的。通过仔细阅读文档、回顾代码并进行修改,我成功解决了这个问题,并生成了正确时长的MP4文件。这个经历让我学到了很多,并增加了我在使用FFmpeg SDK时的经验和知识。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复