重新编码vlc创建的mpeg2 .ts文件导致20秒文件; AKA:隐藏流的多流文件

时间:2016-11-12 20:00:35

标签: ffmpeg vlc v4l2 ffprobe re-encoding

我正在录制vlc关闭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秒呢?

2 个答案:

答案 0 :(得分: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个流保存在同一个文件中是无稽之谈。

<强> SUCCESS!

下一次尝试是:

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。正是我想要的!我的视频编辑器接受他们没问题。解决!

答案 1 :(得分:0)

我在视频处理基础架构中支持传输流(ts)视频文件也遇到了类似的挑战。我使用ffmpegts转换为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的视频流,其比特率相对较低,音频带libfaac并将moov原子移动到Web兼容性文件的开头(-movflags faststart

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

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