如何确定编解码器/容器组合是否与 FFmpeg 兼容?

2023-12-14

我正在考虑重新混合一些保存音频和视频的容器,以便提取最好的第一个音频流,并将其存储在一个新的容器中,例如only音频流存在。

FFmpeg 的输出上下文是这样创建的:

AVFormatContext* output_context = NULL;
avformat_alloc_output_context2( &output_context, NULL, "mp4", NULL );

我有一份可接受的输出的候选名单,例如MP4、M4A 等……本质上是 Apple 音频文件服务可读的文件:

kAudioFileAIFFType              = 'AIFF',
kAudioFileAIFCType              = 'AIFC',
kAudioFileWAVEType              = 'WAVE',
kAudioFileSoundDesigner2Type    = 'Sd2f',
kAudioFileNextType              = 'NeXT',
kAudioFileMP3Type               = 'MPG3',   // mpeg layer 3
kAudioFileMP2Type               = 'MPG2',   // mpeg layer 2
kAudioFileMP1Type               = 'MPG1',   // mpeg layer 1
kAudioFileAC3Type               = 'ac-3',
kAudioFileAAC_ADTSType          = 'adts',
kAudioFileMPEG4Type             = 'mp4f',
kAudioFileM4AType               = 'm4af',
kAudioFileM4BType               = 'm4bf',
kAudioFileCAFType               = 'caff',
kAudioFile3GPType               = '3gpp',
kAudioFile3GP2Type              = '3gp2',
kAudioFileAMRType               = 'amrf'

我的问题是:FFmpeg 中是否有一个简单的 API,可以根据音频流所在的编解码器来选择兼容的输出容器?


有一个动态的方法可以解决这个问题。这枚举了每个容器的编解码器,但您也得到了相反的结果:

// enumerate all codecs and put into list
std::vector<AVCodec*> encoderList;
AVCodec * codec = nullptr;
while (codec = av_codec_next(codec))
{
    // try to get an encoder from the system
    auto encoder = avcodec_find_encoder(codec->id);
    if (encoder)
    {
        encoderList.push_back(encoder);
    }
}
// enumerate all containers
AVOutputFormat * outputFormat = nullptr;
while (outputFormat = av_oformat_next(outputFormat))
{
    for (auto codec : encoderList)
    {
        // only add the codec if it can be used with this container
        if (avformat_query_codec(outputFormat, codec->id, FF_COMPLIANCE_STRICT) == 1)
        {
            // add codec for container
        }
    }
}

如果您只想要特定的容器或编解码器,您可以使用白名单及其name or id字段并在枚举时使用它。

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

如何确定编解码器/容器组合是否与 FFmpeg 兼容? 的相关文章

  • Mojave/macOS 10.14.0:[AVPlayerItem 持续时间] 始终不确定

    我正在尝试使用以下代码读取本地存储的音频文件的持续时间 import
  • iPhone 上的 SoundManager2 - 声音无法在 jQuery Load 上播放

    我正在尝试使用 SoundManager2 作为 iPhone Web 应用程序的一部分 以便在使用 jQuery 提交表单后播放声音 播放的特定声音取决于结果 因此结果页面设置一个变量来标识要播放的声音文件 这一切在桌面上运行都没有问题
  • 使用 ffmpeg 进行视频标准化

    无论如何 有没有使用 ffmpeg 脚本将视频亮度标准化为其完整的动态范围 我一直在尝试用 lutyuv 这样做 ffmpeg i input mp4 vf lutyuv y val minval 255 maxval minval 输出
  • 使用 Python 从原始帧创建 MPEG4 视频文件

    我有一个原始视频帧源 我可以在 Python 中访问它 我想用它创建一个 MPEG4 视频 并带有 MP3 背景音乐 Python 中有哪些类型的工具和库可用于此类任务 最好我想要一个 API 我可以为其提供输出文件名 然后将各个帧作为 2
  • 如何使用 PJSIP 为 iOS 客户端应用程序捕获并翻译其他语言的传入音频流?

    我想在基于 VoIP 的 iOS 客户端应用程序中集成语言转换器 该应用程序将根据用户选择将实时传入音频流翻译为其他选定的语言 我正在使用 PjSip 开源库来支持 VoIP 呼叫 对于语言翻译 我想使用语音到文本和文本到语音开源库 现在我
  • 如何对重新采样的音频数据进行双三次(或其他非线性)插值?

    我正在编写一些以不同速度播放 WAV 文件的代码 以便波形要么更慢 音调更低 要么更快 音调更高 我目前正在使用简单的线性插值 如下所示 int newlength int Math Round rawdata Length lengthM
  • 如何低延迟地使用 Android 音频

    Problem 您可能听说过 Android 不提供低延迟音频 API 我所说的低延迟音频是指您应该能够从麦克风获取音频信号并播放声音 中间没有太多时间间隔 例如 5 7 毫秒 我尝试过旧的java 带有AudioRecord和AudioT
  • 在 FFmpeg 中使用 -filter_complex amerge 时混合流

    我目前遇到 ffmpeg 及其过滤器之一的问题 我正在尝试将视频的 2 个音频流合并为一个 为此我尝试了这个命令 ffmpeg i home maniaplanet Videos ManiaPlanet 2014 08 21 20 09 1
  • C# 从视频文件的一部分中提取帧

    使用 AForge ffmpeg 包装器 您可以使用 VideoFileReader 类从视频中提取帧并将其保存为位图 请参阅以下示例 提取 avi 文件的帧 https stackoverflow com questions 178256
  • YUV420p 上的大量绿色 --> iOS 上 OpenGL 2.0 着色器中的 RGB

    我想使用 ffmpeg 和 OpenGL ES 2 0 为 iOS 制作一个电影播放器 但我有一些问题 输出 RGB 图像有很多绿色 这是代码和图像 480x320 宽度和高度 512x512 纹理宽度和高度 我从 ffmpeg AVFra
  • 如何在Delphi 7中监听麦克风并检测声音响度

    我需要一个程序来捕获麦克风输入声音超过特定阈值时的事件 那么我可能需要不断地听麦克风 并以某种方式测量声音幅度 Delphi 7 中可以这样做吗 我建议您使用低音音频库 http www un4seen com bass html http
  • Android 中的音频交叉淡入淡出

    我正在开发一个媒体播放器用于我的学习目的 我希望在媒体播放器应用程序中具有交叉淡入淡出功能 但我不知道从哪里开始 我尝试在互联网上搜索但没有运气 我使用的是安卓MediaPlayer所有媒体播放器相关操作的类 任何人都知道任何解决方法可以实
  • 将每分钟的 MP3 导出为单独的 WAV

    这绝对是一个奇怪的问题 但我正在寻找一种方法 将 60 分钟的 mp3 混合拆分为 60 个单独的 1 分钟长的 wav 文件 以便与 Echonest 等音频指纹识别 API 一起使用 这是否可以在单个 ffmpeg 命令中实现 或者我是
  • 使用 ffmpeg 在纯色背景上叠加延时视频

    我有很多名为的主页屏幕截图homescreen000001 png homescreen000002 png等 我正在尝试使用 ffmpeg 创建这些图像的延时视频 当我运行以下命令时 它通常可以正常工作 ffmpeg f image2 i
  • 合并来自 ffmpeg 的两个视频

    我想使用 ffmpeg 将两个 mp4 视频组合成一个 mp4 视频 到目前为止我尝试过的是 ffmpeg i input1 mp4 i input2 mp4 output mp4 但是 每次我获取带有第一个输入的视频编解码器的视频而不是另
  • 使用快速同步 h264_qsv 编码器时 ffmpeg avcodec_encode_video2 挂起

    当我使用 mpeg4 或 h264 编码器时 我能够使用 ffmpeg 3 1 0 的 API 成功编码图像以生成有效的 AVI 文件 但是 当我使用快速同步编码器 h264 qsv 时 avcodec encode video2 有时会挂
  • FFmpeg - H264 编码器找不到有效设备并且无法配置编码器

    我尝试使用 H264 编码器进行编码 但是当我这样做时 出现以下错误 h264 v4l2m2m 0x55682d2416c0 Could not find a valid device h264 v4l2m2m 0x55682d2416c0
  • 如何在 iOS 中使用 AVPlayer 缓冲音频?

    我想播放来自互联网的流音频 我编写了播放流的代码 但它没有任何缓冲区 因此如果信号较弱 应用程序将停止播放音频 这是我的代码 import UIKit import AVFoundation import MediaPlayer impor
  • C# - 捕获 RTP 流并发送到语音识别

    我正在努力实现的目标 在 C 中捕获 RTP 流 将该流转发到 System Speech SpeechRecognitionEngine 我正在创建一个基于 Linux 的机器人 它将接受麦克风输入 将其发送给 Windows 机器 Wi
  • 访问 AVFrame 的每个像素

    我需要访问 FFMPEG 的 AVFrame 对象的每个像素信息 如果是 RGB 则每个像素的每种颜色 R G 和 B 我怎样才能做到这一点 如果您已经前进到正确的框架 类似于 img convert ctx ffmpeg sws getC

随机推荐

  • 为什么Windows服务不调用OnStart方法?

    我创建了一个 Windows 服务应用程序 其中包含OnStart方法 该方法将从中读取路径应用程序配置文件 创建一个对象 然后服务写入该对象的重写ToString 方法到一个文件StreamWriter 当我使用 手动启动此服务 时 这是
  • php三元运算符格式化

    这有效
  • C / C++ 中的关键字重新定义

    我可以在 C 中使用 define 重新定义关键字吗 我在 C 标准中发现了这一点 ISO IEC 14882 1998 和 ISO IEC 14882 2003 17 4 3 1 1 宏名称 lib macro names 2 包含标题的
  • Xaml 中的动态列绑定

    这是之前帖子的后续问题 here 我有一些 标题 信息存储为 Dictionary
  • 每秒更改图片框中的图像 C#

    我正在创建一个 WinForm 应用程序 它用网络摄像头拍摄一个人的照片 现在正在尝试创建倒计时效果 我有 4 张图像想要循环浏览 但事实证明这很难完成 我使用了秒计时器 但所发生的只是应用程序有点滞后 然后显示最后一张图像 有谁知道我如何
  • SetBounds 和 SetBoundsCore 有什么区别

    在 WinForms 中 您可以使用以下命令设置控件的边界SetBounds 或者如果您已经创建了用户控件 则可以覆盖SetBoundsCore 我想知道 他们的做法相同还是有什么不同 首先SetBounds不是虚拟的 因此如果您需要在设置
  • VSCode 仅导航回本地到当前文件?

    VSCode 中是否有一个选项可以限制 向后导航 这样它只会带您返回光标在当前文件中最后一个位置 这是当前的行为 在文件A上 打开方法foo 在文件A上 打开方法栏 关于文件B 打开方法baz 在文件A上 打开方法bor 如果我在 bor
  • 通过匹配键组合两个不相等的数组

    我想将下面的两个数组合并为一个 更具体地说 我想将第二个数组的内容添加到第一个数组中的匹配键 最终数组中的键应该具有两个数组的匹配键的内容 Array 123456789 404045862944400 gt 192 123456789 4
  • Chef apt_repository 开始失败并出现 SSL 验证错误

    从过去 2 天开始 我们开始看到与 apt repository 资源相关的 Chef 执行失败 厨师 客户执行也遇到了类似的失败 主厨独奏版本 12 19 36 操作系统 Ubuntu 14 中的 Ubuntu v18 请参阅 Chef
  • JavaScript 会成为一种“正确的”基于类的语言吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我指的是 MDN 关于 JavaScript 的 未来保留字 的文章 用于新的严格模式 https developer mozilla org en US docs Web JavaScr
  • 有人可以告诉我如何用循环替换以下 javascript 代码吗?

    dataBase 0 valueline d3 svg line x function d return x d Date y function d return y d dataBase 0 columnline dataBase 1 v
  • 如何使用 IAccessible 在 Firefox 中访问文档的 HTML

    我可以使用以下代码从 Firefox 窗口获取 IAccessible 对象 Guid guid new Guid 618736E0 3C3D 11CF 810C 00AA00389B71 object obj null int ret A
  • TDD:为什么让应用程序代码知道它正在测试而不是运行可能是错误的?

    In 这个线程 布莱恩 唯一的回答者 说 你的代码应该以与测试无关的方式编写 单个评论说 你的代码绝对不应该在全局 我正在测试标志 上分支 但都没有给出理由 我会really喜欢听一些关于此事的理性想法 进入给定的应用程序类并设置一个布尔值
  • CocoaPods 未安装或未处于有效状态

    Launching lib main dart on iPhone 11 Pro Max in debug mode Warning CocoaPods is installed but broken Skipping pod instal
  • 后台任务中的 Toast 通知响应

    我正在编写一个可以在后台任务中显示 toast 通知的应用程序 我使用BackgroundTaskBuilder 在通知中 我使用两个按钮 它们应该执行两个不同的功能 但我无法获得通知的响应 我在互联网上读到我应该为此启动另一个后台任务 但
  • 如何在服务中使用 kernel.terminate 事件

    我做了一个运行繁重任务的服务 该服务在控制器中调用 为了避免页面加载时间过长 我想返回 HTTP 响应并在之后运行繁重的任务 我读过我们可以使用 kernel terminate 事件来做到这一点 但我不明白如何使用它 目前我尝试在 Ker
  • @Autowired 不适用于球衣和弹簧

    当我当时运行测试时 Autowired 正在工作 但是当我运行 Web 应用程序并尝试当时获取数据时 它会抛出空指针异常 这是我的控制器 在此 BuyerRepo 中始终为 null import com retail exception
  • 在 Ruby on Rails 3 中使用 Twitter Bootstrap 图标作为链接的最佳方式?

    在 Rails 3 中使用 Twitter Bootstrap 提供的图标作为链接的最佳方式是什么 目前 我像粘贴的代码片段一样使用它 但当我使用平板电脑查看网页时 该图标不显示 我确信有更好的方法来使用 Twitter Bootstrap
  • 如何将 env 文件与 GitHub Actions 结合使用?

    我有多个环境 dev qa prod 并且我正在使用 env 文件来存储机密等 现在我要切换到 GitHub Actions 我想使用我的 env 文件并将它们声明到envgithub actions yml 的部分 但从我到目前为止所看到
  • 如何确定编解码器/容器组合是否与 FFmpeg 兼容?

    我正在考虑重新混合一些保存音频和视频的容器 以便提取最好的第一个音频流 并将其存储在一个新的容器中 例如only音频流存在 FFmpeg 的输出上下文是这样创建的 AVFormatContext output context NULL av