你们能帮我弄清楚发生了什么吗?我是 ffmpeg 的新手,但在网上找不到有关此问题的任何信息。这是我关于编码问题的第一篇文章,如果我遗漏了什么,请告诉我!
我使用以下改编自的 ffmpeg 命令每 5 分钟采样 5 秒的视频使用 ffmpeg 从每分钟中提取 x 秒:
% ffmpeg -i in.mp4 -vf "select='lt(mod(t,300),5)',setpts=N/FRAME_RATE/TB" out.mp4
我注意到它正确地选择了视频的前 5 秒,总共只有 20 秒的选定视频,而不是其余部分(视频本身是 94 分钟)。我还注意到我的 Mac 无法在 Quicktime 上播放原始视频(但 VLC 版本 3.0.14 可以),所以我想知道将其重新转换为相同的文件格式是否会有什么效果:
% ffmpeg -i in.mp4 in1.mp4
然后,我使用新转换的 in1.mp4 运行选择命令,并将生成的 out.mp4 采样到正确的长度!
问题是“转换”需要很长时间,而我每周要采样 1512 小时的素材,没有时间转换每个视频。
原始视频信息
% ffmpeg -i in.mp4
ffmpeg version N-102563-gf9eb440e78-tessus https://evermeet.cx/ffmpeg/ Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.17)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 57. 0.100 / 57. 0.100
libavcodec 59. 1.100 / 59. 1.100
libavformat 59. 2.100 / 59. 2.100
libavdevice 59. 0.100 / 59. 0.100
libavfilter 8. 0.101 / 8. 0.101
libswscale 6. 0.100 / 6. 0.100
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mpeg, from 'in.mp4':
Duration: 01:34:20.84, start: 20011.729711, bitrate: 1503 kb/s
Stream #0:0[0x1e0]: Video: hevc (Main), yuvj420p(pc), 2592x1944, 51 tbr, 90k tbn
“转换”的视频信息
% ffmpeg -i in1.mp4
ffmpeg version N-102563-gf9eb440e78-tessus https://evermeet.cx/ffmpeg/ Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.17)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 57. 0.100 / 57. 0.100
libavcodec 59. 1.100 / 59. 1.100
libavformat 59. 2.100 / 59. 2.100
libavdevice 59. 0.100 / 59. 0.100
libavfilter 8. 0.101 / 8. 0.101
libswscale 6. 0.100 / 6. 0.100
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf59.2.100
Duration: 01:34:20.90, start: 0.000000, bitrate: 4087 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 2592x1944, 4082 kb/s, 51 fps, 51 tbr, 13056 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
At least one output file must be specified
Clearly, the "converted" video has a lot more metadata for some reason?
我的问题是:
- 为什么原始视频无法正确选择或读取?
- 重新转换为相同的文件格式可以让 ffmpeg 正确选择,有什么原因吗?
- 有没有更好的方法让 ffmpeg 正确选择这 5 秒的样本,而无需先进行转换?
谢谢!
编辑/更新:我意识到我正在从 hvec 转换为 h264,这允许 ffmpeg 正确使用选择过滤器,但它仍然不能解决为什么它不能正确过滤原始 hvec 文件格式的问题。
正如@Gyan 所建议的,我在下面附上了有关 hvec/h.265 文件格式的报告:
https://drive.google.com/file/d/1GjGmnUErPCIr3qoszXweAA8OiWXdpETg/view?usp=sharing
答案1
虽然 fps 被检测为 51,因为 ffmpeg 使用最短的帧间持续时间来确定该值,但平均 fps 为 10。对于 94 分钟的视频,有 19 个 5 分钟的间隔,因此要选择 95 秒的视频。在 10 fps 下,即 950 帧。输出持续时间很短,因为 ffmpeg 使用检测到的 fps 对其进行重新计时。
在这种情况下,10 是更好的选择。使用
ffmpeg -i in.mp4 -vf "select='lt(mod(t,300),5)',setpts=N/10/TB" out.mp4