从 UWP 上的 mp4 文件中快速提取帧
Fast frame extraction from mp4 files on UWP
我正在尝试比实时更快地提取和分析 mp4 文件,因为我不需要每一帧。
我试过以下方法:
composition.GetThumbnailAsync(TimeSpan.FromSeconds(i),160,90,VideoFramePrecision.NearestKeyFrame);
在任何处理之前给了我大约 1fps。
mediaPlayer.PlaybackSession.PlaybackRate = x;
其中 x 对每个视频的作用不同;有时会播放流畅的 60fps 播放直到 x=2,但在其他情况下会导致 1 fps。
最好的结果是
媒体播放器设置 mediaPlayer.IsVideoFrameServerEnabled = true;
mediaPlayer.StepForwardOneFrame();
在 mediaPlayer_VideoFrameAvailable
这将确保所有下一帧在每个帧实际完成后到达(好坏取决于文件),但这仍然在浪费资源,因为我正在获取每一帧,并且需要每 >5 帧。
我认为这都与视频中的关键帧或 "I" 帧有关,但我看不出有办法只获取这些。
关于在一次跳过 n 帧的同时更快地获取帧的任何想法?
没有比获取第 n 帧更有效的方法了。您可以将 Position 设置为每第 n 帧,但搜索算法会搜索最近的前一个关键帧,然后从那里解码。因此,您可能会通过设置位置来解码更多帧。因此,您可能会节省通过帧步解码每一帧的时间。使用 MediaPlayer 寻找关键帧没有简单的方法。您需要解析 h.264 文件以获得关键帧距离,然后您可以将位置设置为此节奏。
我正在尝试比实时更快地提取和分析 mp4 文件,因为我不需要每一帧。
我试过以下方法:
composition.GetThumbnailAsync(TimeSpan.FromSeconds(i),160,90,VideoFramePrecision.NearestKeyFrame);
在任何处理之前给了我大约 1fps。
mediaPlayer.PlaybackSession.PlaybackRate = x;
其中 x 对每个视频的作用不同;有时会播放流畅的 60fps 播放直到 x=2,但在其他情况下会导致 1 fps。
最好的结果是
媒体播放器设置 mediaPlayer.IsVideoFrameServerEnabled = true;
mediaPlayer.StepForwardOneFrame();
在 mediaPlayer_VideoFrameAvailable
这将确保所有下一帧在每个帧实际完成后到达(好坏取决于文件),但这仍然在浪费资源,因为我正在获取每一帧,并且需要每 >5 帧。
我认为这都与视频中的关键帧或 "I" 帧有关,但我看不出有办法只获取这些。
关于在一次跳过 n 帧的同时更快地获取帧的任何想法?
没有比获取第 n 帧更有效的方法了。您可以将 Position 设置为每第 n 帧,但搜索算法会搜索最近的前一个关键帧,然后从那里解码。因此,您可能会通过设置位置来解码更多帧。因此,您可能会节省通过帧步解码每一帧的时间。使用 MediaPlayer 寻找关键帧没有简单的方法。您需要解析 h.264 文件以获得关键帧距离,然后您可以将位置设置为此节奏。