ffmpeg API h264编码的视频不能在所有平台上播放

2023-12-20

Edit:在之前的版本中,我使用了非常旧的 ffmpeg API。我现在使用最新的库。问题仅略有变化,从“主要”变为“高”。

我正在使用 ffmpeg C API 在 C++ 中创建 mp4 视频。

我希望生成的视频具有“约束基线”配置文件,以便生成的视频可以在尽可能多的平台上播放,尤其是移动平台,但每次我都会得到“高”配置文件,即使我对编解码器进行了硬编码简介为FF_PROFILE_H264_CONSTRAINED_BASELINE。因此,该视频无法在我们所有的测试平台上播放。

这就是“ffprobe video.mp4 -show_streams”告诉我的视频流的信息:

  Metadata:
major_brand     : isom
minor_version   : 512
compatible_brands: isomiso2avc1mp41
creation_time   : 1970-01-01 00:00:00
encoder         : Lavf53.5.0
  Duration: 00:00:13.20, start: 0.000000, bitrate: 553 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x180,
424 kb/s, 15 fps, 15 tbr, 15 tbn, 30 tbc
Metadata:
  creation_time   : 1970-01-01 00:00:00
  handler_name    : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 12
kb/s
Metadata:
  creation_time   : 1970-01-01 00:00:00
  handler_name    : SoundHandler
-------VIDEO STREAM--------
[STREAM] 
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10

profile=High <-- This should be "Constrained Baseline"

codec_type=video
codec_time_base=1/30
codec_tag_string=avc1
codec_tag=0x31637661
width=320
height=180
has_b_frames=0
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuv420p
level=30
timecode=N/A
is_avc=1
nal_length_size=4
id=N/A
r_frame_rate=15/1
avg_frame_rate=15/1
time_base=1/15
start_time=0.000000
duration=13.200000
bit_rate=424252
nb_frames=198
nb_read_frames=N/A
nb_read_packets=N/A
TAG:creation_time=1970-01-01 00:00:00
TAG:language=und
TAG:handler_name=VideoHandler
[/STREAM]
-------AUDIO STREAM--------
[STREAM]
index=1
codec_name=aac
codec_long_name=Advanced Audio Coding
profile=unknown
codec_type=audio
codec_time_base=1/44100
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=s16
sample_rate=44100
channels=2
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/44100
start_time=0.000000
duration=13.165714
bit_rate=125301
nb_frames=567
nb_read_frames=N/A
nb_read_packets=N/A
TAG:creation_time=1970-01-01 00:00:00
TAG:language=und
TAG:handler_name=SoundHandler
[/STREAM]

这是我用来添加视频流的函数。来自 ptr-> 的所有值都是从外部定义的,这些值是否必须是特定值才能获得正确的配置文件?:

static AVStream *add_video_stream( Cffmpeg_dll * ptr, AVFormatContext *oc, enum   CodecID codec_id )
{
AVCodecContext *c;
AVStream *st;  
AVCodec* codec;

// Get correct codec
codec = avcodec_find_encoder(codec_id);
if (!codec) {
    av_log(NULL, AV_LOG_ERROR, "%s","Video codec not found\n");
    exit(1);
}

// Create stream
st = avformat_new_stream(oc, codec);
if (!st) {
    av_log(NULL, AV_LOG_ERROR, "%s","Could not alloc stream\n");
    exit(1);
}

c = st->codec;

/* Get default values */
codec = avcodec_find_encoder(codec_id);
if (!codec) {
    av_log(NULL, AV_LOG_ERROR, "%s","Video codec not found (default values)\n");
    exit(1);
}
avcodec_get_context_defaults3(c, codec);

c->codec_id = codec_id;
c->codec_type = AVMEDIA_TYPE_VIDEO;

c->bit_rate = ptr->video_bit_rate;
av_log(NULL, AV_LOG_ERROR, " Bit rate: %i", c->bit_rate);

    c->qmin = ptr->qmin;
    c->qmax = ptr->qmax;
    c->me_method = ptr->me_method;
    c->me_subpel_quality = ptr->me_subpel_quality;
    c->i_quant_factor = ptr->i_quant_factor;
    c->qcompress = ptr->qcompress;
    c->max_qdiff = ptr->max_qdiff;

    // We need to set the level and profile to get videos that play (hopefully) on all platforms
    c->level = 30;
    c->profile = FF_PROFILE_H264_CONSTRAINED_BASELINE;

c->width = ptr->dstWidth; 
c->height = ptr->dstHeight; 

c->time_base.den = ptr->fps;
c->time_base.num = 1;
c->gop_size = ptr->fps;
c->pix_fmt = STREAM_PIX_FMT;
c->max_b_frames = 0;

// some formats want stream headers to be separate
if(oc->oformat->flags & AVFMT_GLOBALHEADER)
    c->flags |= CODEC_FLAG_GLOBAL_HEADER;

return st;
}

附加信息:

作为参考视频,我使用 Mozilla 提供的 gizmo.mp4 作为在每个平台/浏览器上播放的示例。它绝对具有“约束基线”配置文件,并且绝对适用于我们所有的测试智能手机。你可以在这里下载。 http://www.808.dk/pics/video/gizmo.mp4我们自制的视频并不适用于所有平台,我确信这是因为个人资料的原因。

我也在使用qt-faststart.exe创建 mp4 后将标头移动到文件的开头,因为这不能直接在 C++ 中以良好的方式完成。这可能是问题所在吗?

显然,我正在做某物错了,但我不知道它可能是什么。我会感谢每一个提示;)


我有解决办法。在花了一些时间在 ffmpeg bug tracker 中进行讨论并浏览配置文件设置示例后,我终于找到了解决方案。

需要使用 av_opt_set(codecContext->priv_data, "profile", "baseline" (或任何其他所需的配置文件), AV_OPT_SEARCH_CHILDREN)

所以就我而言,那就是:

Wrong:

// We need to set the level and profile to get videos that play (hopefully) on all platforms
c->level = 30;
c->profile = FF_PROFILE_H264_CONSTRAINED_BASELINE;

Correct:

// Set profile to baseline
av_opt_set(c->priv_data, "profile", "baseline", AV_OPT_SEARCH_CHILDREN);

完全不直观,并且与 API 的其余用法相反,但这就是 ffmpeg 的理念。您不需要理解它,您只需要了解如何使用它;)

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

ffmpeg API h264编码的视频不能在所有平台上播放 的相关文章

  • 在 Android 4.1/4.2 设备中使用 MediaCodec.getOutputFormat() 作为编码器的问题

    我正在尝试使用 MediaCodec 将帧 通过相机或解码器 编码为视频 当通过 dequeueOutputBuffer 处理编码器输出时 我期望收到返回索引 MediaCodec INFO OUTPUT FORMAT CHANGED 因此
  • 将 H.264 I 帧放入 AVSampleBufferDisplayLayer 但不显示视频图像

    在详细回顾了 WWDC2014 Session513 后 我尝试在 IOS8 0 上编写我的应用程序来解码和显示一个实时 H 264 流 首先 我成功构建了H264参数集 当我得到一个带有 4 位起始代码的帧时 就像 0x00 0x00 0
  • ffprobe/ffmpg 静音检测命令

    我正在研究流静音检测 它正在 ffmpeg 中执行以下命令 ffmpeg i http mystream com stream af silencedetect n 50dB d 0 5 f null 2 gt log txt 我想获得日志
  • RGB 缓冲区到 JPEG 缓冲区,这里出了什么问题?

    我需要一种简单的方法将包含 RGB 数据的缓冲区转换为 jpeg 我已经尝试过使用 libjpeg 但我根本无法让它正常工作 例如 将缓冲区保存为位图时会产生以下结果 使用 libjpeg 在内存中对同一图像进行编码会产生以下结果 将图像直
  • UTF-16 十六进制解码 NodeJS

    我正在尝试将 UTF 16 十六进制 Hello 世界 解码为 NodeJS 中的字符串 我尝试通过从十六进制创建缓冲区来做到这一点 let vari new Buffer from 00 48 00 65 00 6C 00 6C 00 6
  • Python:UnicodeDecodeError:“utf8”编解码器无法解码字节

    我正在将一堆 RTF 文件读入 python 字符串中 在某些文本上 我收到此错误 Traceback most recent call last File 11 08 py line 47 in
  • 如何对加密算法进行逆向工程?

    我编写了一个以这种方式加密文本的应用程序 获取输入文本 反转文本 转换为十六进制 用密钥进行异或 Base64编码 现在 我自己没有做很多加密 编码 所以我的问题可能听起来很愚蠢 但是 假设我得到一个包含上述算法内容的文件 而我不知道这个算
  • 在 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
  • MySQL 编码问题 - 从 Windows 到 Linux 结果不同

    我有一个托管在 Windows 服务器上的 MySQL 数据库 当我使用 mysql 控制台从各种 Windows 机器查询特定记录时 我得到P ivi 不正确 当我使用 mysql 控制台从不同的 nix 机器查询相同的记录时 我得到P
  • Windows命令行参数编码是什么?

    Windows 使用什么编码来传递给在 cmd exe 窗口中启动的程序的命令行参数 命令行参数的编码似乎不受使用控制台代码页设置的影响chcp 我将其设置为 UTF 8 代码页 65001 并使用 Lucida Console 字体 如果
  • fortran中双引号和单引号的区别?

    我刚刚开始使用 Fortran 对双引号和单引号的使用感到困惑 它们是等价的 它们的用法没有区别 您可以使用它来打印引号字符之一 print print 首先打印 进而 注意 您还可以在一行中使用两个引号字符来打印一个 print prin
  • 使用 ffmpeg 将视频与其自身连接,但相反

    我能够逆转 ffmpeg i input mp4 vf reverse output reversed mp4 我可以连接 ffmpeg i input mp4 i input mp4 filter complex 0 0 0 1 1 0
  • 使用 ffmpeg 从 unix 命令批量将 wav 文件转换为 16 位

    我有一个由许多子文件夹组成的文件夹 每个子文件夹都有其他子文件夹 其中包含 wav 文件 我想像这样转换所有文件 ffmpeg i BmBmGG BmBmBmBm wav acodec pcm s16le ar 44100 BmBmGG B
  • 通过 XMLHTTPRequest 发布时无法设置自定义编码

    从上个版本的chrome浏览器的JS控制台来看 x new XMLHttpRequest x open POST a 2 x setRequestHeader Content Type application x www form urle
  • 将 H264 视频转换为原始 YUV 格式

    是否可以使用 ffmpeg 从 H264 编码视频创建原始 YUV 视频 我想用 matlab 打开视频并逐帧访问 Luma Cb 和 Cr 分量 是的 您可以 您只需指定像素格式即可 要获取格式的完整列表 ffmpeg pix fmts
  • 为什么 Java BufferedReader() 不能正确读取阿拉伯文和中文字符?

    我正在尝试读取一个每行包含英文和阿拉伯字符的文件以及另一个每行包含英文和中文字符的文件 然而 阿拉伯文和中文的字符无法正确显示 它们只是显示为问号 知道我该如何解决这个问题吗 这是我用于阅读的代码 try String sCurrentLi
  • C# - 捕获 RTP 流并发送到语音识别

    我正在努力实现的目标 在 C 中捕获 RTP 流 将该流转发到 System Speech SpeechRecognitionEngine 我正在创建一个基于 Linux 的机器人 它将接受麦克风输入 将其发送给 Windows 机器 Wi
  • 使用 ffmpeg 提取帧的最快方法?

    您好 我需要使用 ffmpeg 从视频中提取帧 有没有比这更快的方法 ffmpeg i file mpg r 1 1 filename 03d jpg 如果 JPEG 编码步骤对性能要求太高 您可以始终将未压缩的帧存储为 BMP 图像 ff
  • 访问 AVFrame 的每个像素

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

随机推荐

  • 通过Emacs在代码注释中插入图片

    我的脑海里刚刚浮现出一个想法 有没有什么方法可以在代码注释中插入图片来帮助解释我们的代码 毕竟 一张图胜过一千个字 由于我使用Emacs 到目前为止Emacs有任何实现吗 看一眼iimage mode 这是在文本缓冲区中显示图像的标准解决方
  • 如何使用表达式树调用带有引用变量的方法

    我试图弄清楚如何创建一个调用具有引用参数的方法的表达式 让我用一个简单 但人为的 例子来解释我的问题 考虑方法 public static int TwiceTheInput int x return x 2 我可以创建一个表达式来通过执行
  • 如何告知呼叫者失败原因

    我有一个应该做某事的方法 返回值是一个布尔值 成功 失败 如果该方法失败 则有多种原因导致失败 调用者 用户界面层 可以使用这些原因向用户显示适当的消息 这样用户就可以解决问题 我正在考虑用适当的消息抛出异常 但失败原因是正常执行路径的一部
  • sp::CRS(SRS_string = "EPSG:24547") 中的错误:不适用

    我遇到与在 sp 包中分配 CRS 相关的问题 如果我运行 sp CRS SRS string EPSG 4326 sp CRS init epsg 4326 我分别得到这两个错误 sp CRS SRS string EPSG 4326 中
  • 使用javascript浏览服务器目录

    是否可以使用 Javascript 列出子文件夹中包含的所有文件 我有一堆图像也需要链接 但我希望它是动态的 因为列表会发生很大的变化 谢谢你 是否可以使用 Javascript 列出子文件夹中包含的所有文件 不 您通常会设置一个简单的服务
  • 如何在javascript中使用函数(1)(2)?它是如何运作的?

    我理解调用 function 1 但不理解 function 1 2 它是如何工作的 函数 1 2 3 4 也可以吗 在本例中 您假设 function 1 返回一个函数 而不是使用参数 2 调用这个新的匿名函数 看这个例子 functio
  • 为 Performance Point 仪表板设计器创建数据源时数据库不显示

    我设置了共享点服务器 仪表板运行良好 我的数据源也很棒 我正在尝试从不同的 SSAS 计算机添加新的数据源 当我输入服务器时 它甚至不会在数据库下拉列表中列出它 使用最初的 ssas 机器进行了此操作并使其正常工作 从我所看到的一切来看 新
  • Flex 容器的子容器的滚动宽度不正确

    根据w3学校 https www w3schools com jsref prop element scrollwidth asp The 滚动宽度 and 滚动高度属性返回元素的整个高度和宽度 包括不可见的高度和宽度 由于溢出 如果是这样
  • ES6/7 中可以导出 Arrow 函数吗?

    下面的导出语句出现语法错误 export default const hello gt console log say hello why 我只能导出命名函数 export function hello console log hello
  • 使用 html2pdf 时如何摆脱 css 中的左边距和上边距

    我正在使用 html2pdf 我想使用 css 去掉顶部和左边距 但我不能 在输出缓冲边距已设置为 0 之前 它适用于 html 但是当我使用它将其转换为 pdf 时html2pdf http html2pdf fr en default上
  • * 不支持的操作数类型:“numpy.ndarray”和“numpy.float64”

    长期读者 第一次作家 我在谷歌和堆栈溢出上进行了搜索 但并没有真正找到这个问题的一般答案 我在使用 numpy 1 6 2 的 python 2 7 3 中收到 numpy ndarray 和 numpy float64 不受支持的操作数类
  • 如何将网站封装在手机应用程序中?

    我见过很多手机应用程序只是打开一个网页而没有控件 只是页面 我正在寻找指导和链接来开始这样简单的事情 如果您想在 Android 中封装一个网站 您可以使用以下代码来实现 Roskvist https roskvist wordpress
  • F# 析构函数的等效项

    我正在将一个将非托管库包装的 C 类转换为 F 我遇到了重写随后的析构函数的看似简单的问题 class Wrapper P Invoke ellided private SomeType x public Wrapper x new Som
  • Xamarin 安卓 |布局样式

    我正在尝试创建这种布局样式 但仍然不知道该怎么做 有人可以帮助我吗 我需要主布局 并且在布局中必须位于左侧图像视图的颜色 接下来是带有填充父级描述的标题 右侧必须是 img 干得好 我为您设计了左侧标志 标题和描述标签以及右侧图像视图控件
  • 使用 Spring Boot 的 gRPC 和 REST 微服务

    对于一个项目 我想使用 Spring Boot 设置一个小型微服务场景 其中包含一个向客户端公开 REST 和 GraphQL 的 API 网关 一个 Eureka 服务注册表和三个服务 出于性能原因 我希望 API 网关后面的所有服务都能
  • 缺少节点-v57-linux-x64/grpc_node.node

    严格执行以下步骤时 https firebase google com docs admin setup https firebase google com docs admin setup 部署到我的服务器时 我收到此错误 2017 10
  • 非 ASCII 字符需要 web.config 吗?

    尝试制作我的第一个 ASP NET 页面 在 XP 上安装了 IIS 5 1 配置为运行 NET 4 创建了一个新的虚拟目录并添加了一个 aspx 文件 当我浏览该文件时 非 ASCII 字符已损坏 例如 U 00FC 会转换为 U 00C
  • 在 Woocommerce 3 中更改自定义订单状态的电子邮件主题

    我已成功更改 Woocommerce 处理订单的电子邮件主题 using 这个线程 https stackoverflow com a 48880997 3730754 add filter woocommerce email subjec
  • 使用 Selenium 等待元素加载

    我已经仔细查看了这里 但 web 元素等待似乎不适合我的代码 我对 Java 和 Selenium 相当陌生 我想尝试在超时之前将等待元素放入我的代码中 有什么建议么 当到达这个点时它就会崩溃 因为页面确实需要一段时间来搜索这个地址 Ste
  • ffmpeg API h264编码的视频不能在所有平台上播放

    Edit 在之前的版本中 我使用了非常旧的 ffmpeg API 我现在使用最新的库 问题仅略有变化 从 主要 变为 高 我正在使用 ffmpeg C API 在 C 中创建 mp4 视频 我希望生成的视频具有 约束基线 配置文件 以便生成