在 ffmpeg 中,如何使用scale2ref 过滤器缩放 dvdsub 字幕以匹配视频大小?

2024-05-14

我有一个从直播电视录制的 mpeg 文件,其中包含视频以及多个音频和字幕流。我的最终目标是能够创建较小的视频文件,因为 mpeg 文件大小为数 GB。我在这条道路上的第一步只是能够选择视频、音频和字幕流中的每一个并将它们复制到 mkv 文件,丢弃我不感兴趣的流。(我选择 mkv 因为它允许存储dvdsub 字幕流,而其他容器格式则不然。)

我遇到的问题是,当我播放输出视频时,dvdsub 字幕显得非常小,当我研究这个问题时,我发现 ffmpeg 不会自动缩放字幕以匹配源视频:https://trac.ffmpeg.org/ticket/4744 https://trac.ffmpeg.org/ticket/4744

我尝试过使用scale2ref过滤器,但我不理解文档,并且他们给出的示例对我来说毫无意义(请参阅下面的示例)。

我有一个命令选择三个流并将 1 分钟复制到输出,如下所示:

ffmpeg -ss 00:28:00.200 -i Hillary-2016-08-21.mpg -t 00:01:00.000 -map 0:0 -c:v copy -map 0:3 -c:a copy -map 0:6 -c:s dvdsub cut.mkv

这是输出:

Input #0, mpegts, from 'Hillary-2016-08-21.mpg':
  Duration: 01:30:00.06, start: 20852.199389, bitrate: 6813 kb/s
  Program 1 
    Stream #0:0[0xfa]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x12c](eng): Audio: aac_latm (HE-AAC) ([17][0][0][0] / 0x0011), 48000 Hz, stereo, fltp
    Stream #0:2[0x131](ita): Audio: aac_latm (HE-AAC) ([17][0][0][0] / 0x0011), 48000 Hz, stereo, fltp (visual impaired)
    Stream #0:3[0x191](eng): Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:4[0x3ea]: Unknown: none ([11][0][0][0] / 0x000B)
    Stream #0:5[0x3ec]: Unknown: none ([11][0][0][0] / 0x000B)
    Stream #0:6[0x3fc](eng): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006) (hearing impaired)
    Stream #0:7[0x1f40]: Unknown: none ([5][0][0][0] / 0x0005)
File 'cut.mkv' already exists. Overwrite ? [y/N] y
Output #0, matroska, to 'cut.mkv':
  Metadata:
    encoder         : Lavf57.56.100
    Stream #0:0: Video: h264 (Main) (H264 / 0x34363248), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 25 fps, 50 tbr, 1k tbn, 90k tbc
    Stream #0:1(eng): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), 384 kb/s
    Stream #0:2(eng): Subtitle: dvd_subtitle (dvdsub) (hearing impaired)
    Metadata:
      encoder         : Lavc57.64.101 dvdsub
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:3 -> #0:1 (copy)
  Stream #0:6 -> #0:2 (dvb_subtitle (dvbsub) -> dvd_subtitle (dvdsub))
Press [q] to stop, [?] for help
frame= 2956 fps=0.0 q=-1.0 Lsize=   39612kB time=00:00:59.99 bitrate=5408.7kbits/s speed= 216x    
video:36702kB audio:2896kB subtitle:23kB other streams:0kB global headers:0kB muxing overhead: unknown

的文档scale2ref给出了一个带有覆盖的示例,我不想覆盖任何内容,我只想调整字幕流的大小。这是他们的例子:

'scale2ref[b][a];[a][b]overlay'

我最接近的是这样的:

ffmpeg -ss 00:28:00.200 -i Hillary-2016-08-21.mpg -t 00:01:00.000 -map 0:0 -c:v copy -map 0:3 -c:a copy -filter_complex "[0:6]scale2ref[b]" -map "[b]"   cut.mkv

输出是:

Input #0, mpegts, from 'Hillary-2016-08-21.mpg':
  Duration: 01:30:00.06, start: 20852.199389, bitrate: 6813 kb/s
  Program 1 
    Stream #0:0[0xfa]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x12c](eng): Audio: aac_latm (HE-AAC) ([17][0][0][0] / 0x0011), 48000 Hz, stereo, fltp
    Stream #0:2[0x131](ita): Audio: aac_latm (HE-AAC) ([17][0][0][0] / 0x0011), 48000 Hz, stereo, fltp (visual impaired)
    Stream #0:3[0x191](eng): Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:4[0x3ea]: Unknown: none ([11][0][0][0] / 0x000B)
    Stream #0:5[0x3ec]: Unknown: none ([11][0][0][0] / 0x000B)
    Stream #0:6[0x3fc](eng): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006) (hearing impaired)
    Stream #0:7[0x1f40]: Unknown: none ([5][0][0][0] / 0x0005)
Streamcopy requested for output stream 0:0, which is fed from a complex filtergraph. Filtering and streamcopy cannot be used together.

我真的不明白如何使用过滤器并将调整大小的字幕流定向到输出文件中。

任何帮助表示赞赏!谢谢!


scale2ref将其输出标记为视频流,这几乎总是如此。所以 ffmpeg 正在应用的值c:v到缩放的低音炮。

相反,你应该尝试

ffmpeg -ss 28:00.2 -canvas_size 1920x1080 -i Hillary-2016-08-21.mpg -t 1:00 -map 0:0 -c:v copy -map 0:3 -c:a copy -map 0:6 -c:s dvdsub cut.mkv

Use

ffmpeg -ss 28:00.2 -i Hillary-2016-08-21.mpg -t 1:00 -filter_complex "[0:6][0:0]scale2ref[b][a]" -map 0:0 -c:v copy -map 0:3 -c:a copy -map "[b]" cut.mkv -map "[a]" -f null -

scale2ref接受两个输入并吐出两个输出。两端的第二个元素是ref引用视频。因此,必须告诉 ffmpeg 如何处理该引用的直通副本。在上面的命令中,分配了空复用器,这将其发送到遗忘。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ffmpeg 中,如何使用scale2ref 过滤器缩放 dvdsub 字幕以匹配视频大小? 的相关文章

  • 如何让 Python 找到 ffprobe?

    I have ffmpeg and ffprobe安装在我的 mac macOS Sierra 上 并且我已将它们的路径添加到 PATH 中 我可以从终端运行它们 我正在尝试使用ffprobe使用以下代码获取视频文件的宽度和高度 impor
  • iOS:AVPlayer 视频预加载

    我正在使用 AVPlayer 来播放视频 它们的长度很短 2 5秒 它们以随机顺序播放 问题是 当更改视频并开始播放新视频时 设备会滞后很短的时间 但我不希望更改流畅 有没有办法用 AVPlayer 预加载视频 尝试使用AVQueuePla
  • 如何在服务器上使用 ffmpeg 从 WebRTC 流获取音频和视频

    我正在尝试从 WebRTC 流获取音频和视频 并在 ubuntu 服务器上使用 ffmpeg 处理它 转码或转储 我天真地期望它能简单地解释 WebRTC 提供的 sdp 但我错了 我怀疑 ffmpeg 无法发回答案 sdp 必须手动完成
  • 在 Windows Phone 8 中以编程方式下载媒体文件

    我们的应用程序是基于视频 音频的应用程序 我们已将所有媒体上传到 Windows Azure 上 但需要方便用户点播下载音视频文件 以便在本地播放 所以我需要以编程方式下载音频 视频文件并将其保存在IsolatedStorage中 我们有每
  • 加载 HTML 格式的大型视频文件

    这是我的问题 我想播放存储在 S3 存储桶中的大型视频文件 3 6Gb 但该文件似乎太大 并且加载 30 秒后页面崩溃 这是我播放视频的代码 var video document getElementById video const med
  • 有哪些技术可用于程序化视频编辑?

    Problem 用户应该能够从其系统上运行的应用程序 胖客户端 上传高分辨率视频剪辑 在这个应用程序中 我需要一个能够将视频转换为低分辨率版本的框架或库 另一方面 我需要能够立即从图像构建视频的东西 并以看起来像视频的方式对它们进行动画处理
  • ffmpeg 配置复杂过滤器时出错

    ffmpeg 命令存在一些问题 也许有人可以指出我正确的方向 我使用此链接来构建我的命令 那么问题 https stackoverflow com questions 7333232 how to concatenate two mp4 f
  • 如何在 vc++ 中使用samplegrabber?样本采集器未定义

    在视觉社区 2015 我有一个 C 项目 在 cpp 文件顶部我有 include stdafx h include VideoCaptureFilterSample h include VideoCaptureFilterSampleDl
  • FFMPEG 帧到 DirectX 表面

    给定一个指向 FFMPEG 的 AVFrame 的指针avcodec decode video 函数如何将图像复制到 DirectX 表面 假设我有一个指向适当大小的 DX X8R8G8B8 表面的指针 Thanks John 您可以使用
  • 如何使用 ffmpeg av_seek_frame() 在具有帧号的情况下读取任何帧

    int64 t timeBase timeBase int64 t pavStrm gt time base num AV TIME BASE int64 t pavStrm gt time base den int64 t seekTar
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 在一个屏幕上合并 2 个图像输出(HDMI、DVI、VGA 或其他)

    我正在寻找一些不常见的东西 一种设备 可将来自 2 个输出 HDMI DVI VGA 或任何其他类型的图像输出 的图像合并为屏幕上显示的最终图像 输出可以是相同类型 例如 2 个 HDMI 或不同类型 任何有效的都可以 如果不清楚 这里有一
  • Android 视频循环缓冲区与声音

    我正在使用谷歌的开源示例 Grafika https github com google grafika 我正在使用它ContinuousCaptureActivity java https github com google grafik
  • 使用 ffmpeg 将 mp4 转换为 gif 时帧率较低

    我正在使用 ffmpeg 将高质量视频转换为 gif 大多数视频都是 60fps 及以上720p 但是当我使用下面的代码将视频转换为 gif 时 我得到的 gif 输出的 fps 非常低 usr bin env palette tmp pa
  • MP4 视频无法在 Firefox 上播放

    我有一个小型家庭服务器 可以托管多个项目 其中包括一些 MP4 示例视频 我一直在使用一个简单的
  • 如何从一堆图像生成视频?

    谁能告诉我从一堆图像 位图 生成视频的方法 可能是开放格式的avi文件或开源库 我使用了 Splicer 但它在生产使用中存在一些错误 字节数图像转视频 SDK http bytescout com products developer i
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • 有什么方法可以安全地在浏览器中显示视频

    有什么方法可以安全地在浏览器中显示视频 就像他的安全措施之一 视频无法下载 谢谢 我想您的意思是您不希望您的视频被下载或复制 如果是这样 那么阻止人们下载视频或多或少是不可能的 甚至有很多工具可以从 YouTube 等大型提供商那里下载 因
  • 在 Chrome 中使用 animate.css 时出现全屏视频问题

    我有一个页面 其中包含使用视频标签的视频 另外 我的页面使用 animate css 向我的元素添加一些动画 问题是 当我在 animate css 中使用样式时 我的视频无法正确全屏显示 这是我的页面的示例 div div class g
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt

随机推荐