ffmpeg - ts文件的帧率控制

标签 ffmpeg gstreamer frame-rate mpeg

我有一个 ts 文件,它是通过使用 x264enc 对原始 yuv 数据进行编码并使用 mpegtsmux 对其进行复用而创建的。

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

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

gstreamer中是否有任何管道?或ffmpeg中的任何命令?我怎样才能做到这一点?

最佳答案

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

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

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



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

以 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 文件中有一些未知流,您可能需要添加 -ignore_unknown 标志。

正如 ffmpeg 的链接中所指定的,输出流顺序是在命令执行中以 map 选项放置顺序指定的。使用 -c:v:0 mpeg2video 选项,我们选择第一个 输出 视频流和重新编码编解码器,而 -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)。对于此类任务,它是一个非常强大的工具。

关于ffmpeg - ts文件的帧率控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41355995/

相关文章:

php - FFMpeg 在命令行中工作,但不在 shell_exec 中

ffmpeg - 加速和 fps 更改后 WMP 中的伪影

android - 你如何用opengl es显示fps(android)

java - FPS 锁定不精确

FFMPEG 三通复用器给出 "Output file #0 does not contain any stream"

c++ - 配置 AVCodecContext 结构以从原始 PCM 编码为 u-law

c - 仅对视频文件的部分进行 Remux 和分段,而输出没有差异

c++ - GStreamer 运行时错误

c++ - gtkmm 和 gstreamermm 测试代码抛出运行时错误

python - 通过 python 使用 maemo 相机