ffmpeg - 使用 ffmpeg 设置 ts 文件的正确开始时间
问题描述
我在 Windows 上使用 ffmpeg 将视频分成多个 10 秒 ts 部分(mpeg-ts 格式)。
要创建第二部分(从视频 10 秒开始,到视频 20 秒结束):
ffmpeg -i sample.avi -ss 00:00:10 -to 00:00:20 -vcodec libx264 -acodec aac -vf scale=426:-1 out1.ts
但是当我使用 ffprobe 检查文件时,它说:
Duration: 00:00:10.02, start: 1.458667, bitrate: 359 kb/s
所以持续时间可以,但开始时间不正确。无论如何我可以使用ffmpeg将其更正为00:00:20吗?最好的解决方案当然是能够在我的第一个命令中设置正确的开始时间,在那里我取出 10 秒部分,但我也可以运行第二个命令来修复时间。
这可能吗?找不到任何文档,我找到的所有示例都不适用于我的确切问题,并且似乎不起作用,然后我就玩弄它们。
ffprobe 的完整输出:
ffprobe.exe out1.ts
ffprobe version git-2020-02-06-343ccfc Copyright (c) 2007-2020 the FFmpeg developers
built with gcc 9.2.1 (GCC) 20200122
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
libavutil 56. 39.100 / 56. 39.100
libavcodec 58. 68.100 / 58. 68.100
libavformat 58. 38.100 / 58. 38.100
libavdevice 58. 9.103 / 58. 9.103
libavfilter 7. 74.100 / 7. 74.100
libswscale 5. 6.100 / 5. 6.100
libswresample 3. 6.100 / 3. 6.100
libpostproc 55. 6.100 / 55. 6.100
Input #0, mpegts, from 'out1.ts':
Duration: 00:00:10.02, start: 1.458667, bitrate: 359 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 426x260 [SAR 780:781 DAR 18:11], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 131 kb/s
解决方案
您可以添加-muxdelay 10
参数。
更新:正如 jarno 评论的那样,添加:-muxdelay 10 -muxpreload 10
我在这里找到了解决方案。
使用以下命令:
ffmpeg -y -i sample.avi -ss 00:00:10 -to 00:00:20 -vcodec libx264 -acodec aac -vf scale=426:-1 -muxdelay 10 out1.ts
我得到以下结果ffprobe
:
Input #0, mpegts, from 'out1.ts':
Duration: 00:00:10.05, start: 20.020222, bitrate: 141 kb/s
我使用以下命令进行测试:
使用合成视频和合成音频(未压缩的原始格式)生成 AVI 示例文件:
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=30 -f lavfi -i sine=frequency=500 -c:v rawvideo -pix_fmt bgr24 -c:a pcm_s16le -ar 22050 -t 30 sample.avi
执行您的问题中的命令和
ffprobe
(我添加-y
用于覆盖输出):ffmpeg -y -i sample.avi -ss 00:00:10 -to 00:00:20 -vcodec libx264 -acodec aac -vf scale=426:-1 -muxdelay 10 out1.ts ffprobe out1.ts
更新:
正如 jarno 评论的那样,添加-muxpreload 10
也是必要的。
对于更清洁的解决方案,请添加:-muxdelay 10 -muxpreload 10
命令示例:
ffmpeg -y -i sample.avi -ss 00:00:10 -to 00:00:20 -vcodec libx264 -acodec aac -vf scale=426:-1 -muxdelay 10 -muxpreload 10 out1.ts
推荐阅读
- windows - 如何根据命令行参数在 Inno Setup 中提示重新启动?
- xml - 如何从 Google 表格创建 XML 提要?
- sql - 按日期格式化和过滤来自 Google BigQuery 的查询结果
- xml - 同一节点上的 XPATH 和条件
- reactjs - 如何使用反应路由器?
- html - 字体真棒图标在 HTML 中不起作用
- plot - Mathematica - 导出多个绘图,每个绘图都有不同的名称(取决于绘图中使用的变量)
- python - 根据另一个数据帧的行值对一个数据帧中的列求和
- php - 插入期间导致 SQL 错误的模型特征
- python - 你能用参数元组创建方法吗?