ts文件的帧率控制

Frame rate control of a ts file

我有一个 ts 文件,它是通过使用 x264enc 编码原始 yuv 数据并使用 mpegtsmux 混合创建的。

并且这个文件包含不止一个流。例如它可能包含两个视频流,或者它可能包含两个视频和一个文本流。

25帧/秒,720X576分辨率。我想将它的 fps 更改为 10,并且所有三个流也必须出现在新的 ts 文件中。

gstreamer 中有这方面的管道吗?或ffmpeg中的任何命令?我该怎么做?

我认为这在 GStreamer 中是不可能的。至少不是直截了当的。但是,只要可以正确发现文件中的所有序列,ffmpeg 应该是可能的。

来自ffmpeg的wiki,地图选项 (https://trac.ffmpeg.org/wiki/Map):

The "map" command basically means "include this stream into the immediately following OUTPUT file."

使用地图选项可以重新编码您想要的视频流并保持其他视频流不变。

以input.ts文件为例,有2个不同的视频流和一些音频流,接下来的方法应该是:

ffmpeg -i input.ts -map 0:0 -map 0:2 -map 0:3 -map 0:4 -map 0:23 -map 0:10 -map 0:14 -c:v:0 mpeg2video -r:v:0 10 -c:v:1 copy -c:a copy outputmini.ts

请注意,视频流为 0:0 和 0:23。第一个视频流 (mpeg2) 被重新编码为 10 fps,而 0:23 视频流 (x264) 只是被复制到输出。请记住,如果 .ts 文件中有一些 unknown 流,您可能需要添加 -ignore_unknown 标志。

正如在ffmpeg的link中指定的那样,输出流顺序在map选项放置顺序中的命令执行中指定。使用 -c:v:0 mpeg2video 选项,我们 select 第一个 输出 视频流并重新编码编解码器,而 -r:v:0 10 选项将第一个视频流帧速率设置为 10 fps。命令行中的其他选项使用相同的参数将输入流复制到输出。

ffmpeg 下一个输出:

Output #0, mpegts, to 'outputmini.ts':
  Metadata:
    encoder         : Lavf57.41.100
    Stream #0:0: Video: mpeg2video (Main), yuv420p, 640x576 [SAR 6:5 DAR 4:3], q=2-31, 200 kb/s, 10 fps, 90k tbn, 10 tbc
    Metadata:
      encoder         : Lavc57.50.100 mpeg2video
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    Stream #0:1(spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, 192 kb/s
    Stream #0:2(qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, 192 kb/s
    Stream #0:3(spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, 96 kb/s (visual impaired)
    Stream #0:4: Video: h264 ([27][0][0][0] / 0x001B), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 50 fps, 50 tbr, 90k tbn, 90k tbc
    Stream #0:5(spa): Audio: eac3 ([6][0][0][0] / 0x0006), 48000 Hz, stereo, 256 kb/s
    Stream #0:6(spa): Audio: eac3 ([6][0][0][0] / 0x0006), 48000 Hz, mono, 64 kb/s (visual impaired)
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video (native) -> mpeg2video (native))
  Stream #0:2 -> #0:1 (copy)
  Stream #0:3 -> #0:2 (copy)
  Stream #0:4 -> #0:3 (copy)
  Stream #0:23 -> #0:4 (copy)
  Stream #0:10 -> #0:5 (copy)
  Stream #0:14 -> #0:6 (copy)

达到预期的输出。

然而,即使我不确定这是否可以完成,我也会瞥见 tsMuxeR 应用程序 (http://www.videohelp.com/software/tsMuxeR)。对于此类任务,它是一个非常强大的工具。