1

我正在使用vlcoff 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 秒?

4

2 回答 2

2

当我找到这个链接时达到了第一个里程碑: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。正是我想要的!我的视频编辑器可以毫无问题地接受它们。解决了!

于 2016-11-23T11:05:09.647 回答
0

在我们的视频处理基础设施中支持传输流 (ts) 视频文件时,我遇到了类似的挑战。我曾经用两遍编码ffmpeg转换ts成文件。mp4

完整的命令:

通过1:

ffmpeg -i camera.ts -filter:v scale=-1:480,setsar=1/1 -pix_fmt yuv420p -threads 0 -r 25/1 -force_fps -c:v libx264 -profile:v baseline -preset slow -x264opts level=3.0:ref=1 -b:v 1000k -maxrate 1000k -bufsize 2000k -s hd480 -c:a libfaac -ar 16000 -ac 2 -ab 128000 -pass 1 -movflags faststart -y video.mp4

通行证 2:

ffmpeg -i camera.ts -filter:v scale=-1:480,setsar=1/1 -pix_fmt yuv420p -threads 0 -r 25/1 -force_fps -c:v libx264 -profile:v baseline -preset slow -x264opts level=3.0:ref=1 -b:v 1000k -maxrate 1000k -bufsize 2000k -s hd480 -c:a libfaac -ar 16000 -ac 2 -ab 128000 -pass 2 -movflags faststart -y video.mp4 >>& ffmpeg.log

我将视频缩小到hd480(852x480)重新编码libx264具有相对较低比特率的基线级别 3 的视频流以及带有libfaacmoov atom 的音频并将其移动到文件的开头以实现 Web 兼容性 ( -movflags faststart)

有关标志的所有详细信息,请参阅FFMpeg 文档

请注意,我刚刚挖掘了这个适用于我们设置的命令:处理来自 IP 摄像机的传输流记录。您可能需要专门调整分辨率和比特率以满足您的需求。希望这能为您指明正确的方向。

于 2016-11-14T09:27:24.590 回答