gpt4 book ai didi

ffmpeg - 重新编码 vlc 创建的 mpeg2 .ts 文件会产生 20 秒的文件;又名 : multi-stream file with hidden streams

转载 作者:行者123 更新时间:2023-12-04 22:55:50 26 4
gpt4 key购买 nike

我正在用 vlc off v4l2 录制一些东西(以防万一),我刚刚选择了第一种有效的格式,即使用 TS 容器的 mpeg2。文件导致 .ts 扩展名,由 vlc 自动选择。然后,当我尝试将视频文件放入我的视频编辑器时,它说视频时长为 19,884 小时,实际上应该是 6 分钟左右(大小约为 80mb)。当我尝试在 xine 中播放它时,它会正确显示持续时间(vlc 没有),当我使用 ffprobe 时:

[mpegts @ 0x9b2c0a0] max_analyze_duration 5000000 reached at 5000000
Input #0, mpegts, from 'loopbacktestcap.ts': Duration: N/A, start:
17978.139456, bitrate: N/A Program 1
Stream #0:0[0x44](): Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 104857 kb/s, 30 fps, 30
tbr, 90k tbn, 60 tbc
Stream #0:1[0x46](): Video: mpeg2video ([2][0][0][0] / 0x0002), 90k tbn

特别注意这一行:
   Duration: N/A, start: 17978.139456, bitrate: N/A   Program 1 

我查了一下,似乎缺少持续时间与容器有关。但是我尝试了一些重新编码的东西(我尝试了 -vcodec copy、mpeg2、libx264...),我所能得到的只是 20 秒的 1.1mb - 1.8mb 文件。

那么如何重新编码这个文件以显示持续时间,我得到完整的 6 分钟,而不是前 20 秒?

最佳答案

当我找到这个链接时达到了第一个里程碑:Map - ffmpeg -- Example #8 这让我尝试:

ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts

产生以下内容:
[mpegts @ 0x9980f40] max_analyze_duration 90000000 reached at 90000000
Input #0, mpegts, from 'loopbacktestcap.ts':
Duration: 00:16:00.96, start: 17978.139456, bitrate: 695 kb/s
Program 1
Stream #0:0[0x44](): Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 104857 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
Stream #0:1[0x45](): Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 104857 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
Stream #0:2[0x46](): Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 104857 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc

请注意,它现在为我提供了正确的持续时间以及第二个(技术上是第三个)的额外流和更多信息。于是我跑了:
ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts  -map 0 -c copy map0.mp4

现在生成了一个 79451050 字节的文件 map0.mp4,其中 my_mpeg2_file.ts 是 83499636。我尝试在 vlc 中播放它,它显示持续时间为 9:12,但如果我慢跑播放位置,还有两个 vlc 窗口打开,vlc 开始表现得很奇怪;视频显示区域挂起,但播放位置指示器继续进行。这可能只是一个错误的 vlc,但我被困在这一点上。如果有人看到我在这里遗漏的任何东西,请告诉我。

然而, xine 无法播放新文件(它播放原始文件并显示它是 6 分钟长 - 实际上,持续时间计数器在我播放文件时有点疯狂并且不断变化,所以我不知道)。

所以,我尝试的下一个命令是:
ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts  -map 0 -c libx264 map0x264.mp4

尝试播放生成的文件(43652975 字节,出于好奇)导致 vlc 中出现同样奇怪的行为,现在我可以看到它正在为每个流打开一个新窗口,并在“轮到”时播放流在其各自的窗口中,卡住其他窗口的其他显示区域。尝试关闭它们会停止所有播放并关闭两个额外的窗口。我猜想将所有 3 个流保存在同一个文件中是无稽之谈。

成功!

下一次尝试是:
ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts  -map 0:0 -c copy map0_0.ts
ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts -map 0:1 -c copy map0_1.ts
ffmpeg -probesize 90M -analyzeduration 90M -i my_mpeg2_file.ts -map 0:2 -c copy map0_2.ts

这导致文件大小:
 4912 map0_0.ts
5372 map0_1.ts
74728 map0_2.ts

map0_0.ts 是 20 秒长,map0_1.ts 是 1:12 长的静止图像,map0_2.ts 是 9:12。正是我想要的!我的视频编辑器可以毫无问题地接受它们。解决了!

关于ffmpeg - 重新编码 vlc 创建的 mpeg2 .ts 文件会产生 20 秒的文件;又名 : multi-stream file with hidden streams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40567066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com