【问题标题】:Video/Audio file analysis - meta data, similar to MediaInfo视频/音频文件分析 - 元数据,类似于 MediaInfo
【发布时间】:2016-05-23 10:24:06
【问题描述】:

我通常使用 MediaInfo 查看我的媒体文件,以查看文件中视频/音频轨道的持续时间。我相信 MediaInfo 查看文件的元数据( headers )而不是实际的文件流,可能是由于速度。我想要一个真正通过文件的工具来计算媒体文件中视频/音频轨道的持续时间,而不仅仅是告诉我标题告诉我什么。

我需要这个的原因是因为我有一个媒体文件的实例没有报告正确的音轨持续时间。示例:我有两个文件,一个音频文件和一个视频文件,vid1.mxf 和 aud1.mxf,它们的长度相同。我使用 FFMPEG 将它们“缝合”在一起,并且由于存储故障/网络问题,生成的文件中的音轨很短,但是它在 MediaInfo 中不会报告为短。当我收听该文件时,它显然很短,网络/存储设备必须在“缝合”期间变得无法访问。音频和视频输入文件位于不同的存储设备上。

我过去曾使用过 C# 库 https://github.com/naudio/NAudio,它可以执行此类操作,但它仅适用于单个 .wav 文件,不适用于容器内也有视频的文件( .mxf )。

谢谢

【问题讨论】:

    标签: audio video ffmpeg media-player media


    【解决方案1】:

    这可以使用 ffprobe 来完成,但是文件越大,需要的时间就越多。

    第 1 步提取原始信息

    ffprobe input.mxf -select_streams v -show_entries packet=pts_time,duration_time -of compact
    
    ffprobe input.mxf -select_streams a -show_entries packet=pts_time,duration_time -of compact
    

    这会产生一个读数,其中线条看起来像这样

    packet|pts_time=4.480000|duration_time=0.040000
    

    第 2 步计算持续时间

    对于视频和音频流,您需要查看第一行的pts_time 和最后一行的pts_timeduration_time。则流持续时间为

    pts_time(last line) + duration_time(last line) - pts_time(first line)
    

    还有一个持续时间字段,但它没有记录所有容器格式的值。

    ffprobe input.mxf -show_entries stream=duration
    

    【讨论】:

    • 其实不行,这行不通。它完整​​解码音轨(与 video 持续时间相同)并显示与 MediaInfo 完全相同的持续时间。我尝试了类似的方法,只是用 ffmpeg 解码它并复制音频流,输出为 null,它仍然解码完整的 30 秒(视频),即使在听音频时音频在 25 秒左右停止。
    • 那么最后 5 秒的音频样本为空。音频和视频流是独立的本质。 ffprobe 不会在没有数据包条目的情况下生成数据包条目。试试这个:提取音频摘录ffmpeg -i video -t 5 -vn aud.mp4,其中5 是一个小于视频持续时间的值。然后ffmpeg -i video -i aud.mp4 -c copy -map 0:v -map 1:a joined.mp4。现在运行第 1 步命令并比较最终的 pts_time 值。
    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多