问题标签 [avcodec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1835 浏览

c++ - 如何强制 avcodec 使用未对齐的帧数据平面?

我一直在寻找强制 avcodec 对其 AVFrame 数据使用未对齐内存的选项。

根据像素格式,AVFrame->data 的水平平面可能会填充额外的数据以与内存对齐以提高性能。

例如:每像素 4 字节的 1920 * 1080 视频每个平面将有 1920 * 4 = 7680 字节。

使用 avcodec 如果您正在解码此视频,它将为每个平面创建 7808 个字节。

这增加了 7808 - 7680 = 128 字节的额外填充。

出于我的目的,我想强制 avcodec 使用未对齐的数据,这样我就可以复制整个连续的帧数据块,而不是一次将较小的块复制和格式化为连续块。

在标头中找到以下标志:

将此 AVCodecContext.flags 设置为 CODEC_FLAG_UNALIGNED,假设 AVFrame->data 现在未对齐,事实并非如此。

我不确定我是否正在寻找正确的位置或正确使用此标志。

问候,

好奇的乔治

0 投票
1 回答
2122 浏览

macos - 未找到 avformat.h 和 avcode.h

我正在使用 MAC OSx 和 OpenCv 2.4.8。我正在尝试编译一个程序,其中包括:

avformat.h 和 avcodec.h

我已经在我的计算机中查找了这些文件并且它们存在(在 OpenCv 文件夹中)。

当我这样编译时:

g++ track.cpp -o track -I /Desktop/opencv-2.4.8/include/opencv -L /Desktop/opencv-2.4.8/3rdparty/include/ffmpeg_/libavcodec /Desktop/opencv-2.4.8/3rdparty/包括/ffmpeg_/libavformat -lopencv_highgui -lopencv_core -lavcodec -lavformat

我收到以下错误:

致命错误:找不到“avformat.h”文件 致命错误:找不到“avcodec.h”文件

怎么了??

多谢!!

0 投票
1 回答
275 浏览

opencv - 使用 OpenCV 2.4.8 的 gstreamer 管道程序引发运行时错误

在 Windows x64 上,我有一个使用 OpenCV 2.4.8 的 gstream 管道程序引发关于程序入口点 findHomography 不在库 avcodec-55.dll 中的运行时错误。

这是对话框上的确切消息:

“程序入口点 ?findHomography@cv@@YA?AVMat@AEBV_InputArray@1@0HNAEBV_OutputArray@1@@Z 无法在动态链接库 avcode-55.dll 中找到。”

我不知道如何调试此问题或尝试什么。如果您遇到类似问题或建议我如何调试此类问题,我将感谢您的指点。

问候,阿米特!

0 投票
1 回答
2714 浏览

c++ - avcodec YUV 转 RGB

我正在尝试使用 libswscale 将 YUV 帧转换为 RGB。

这是我的代码:

我的程序在 sws_scale 函数上执行 SEGFAULT。

VideoFrame 是一个 AVFrame 结构,它保存我的解码帧。

我认为这是因为 YUV 帧来自 avcodec_decode_video2,它返回一个像这样的数组:

而 YUV420P 理论上只有一个平面(根据维基百科,YUV420P 是一种平面格式,然后将 Y、U、V 数据分组在一起)。所以,我不知道如何继续使用 swscale 将 Y、U、V 数据分离为 RGB24 的数组转换为 RGB24。

请帮助我,谢谢:)

0 投票
1 回答
590 浏览

ffmpeg - ffmpeg repo 中 av_codec_set_pkt_timebase 的源代码在哪里

我正在使用 libavformat 来复用 AVI 文件。

当我查看 ffmpeg 源代码时,我找不到 av_codec_set_pkt_timebase 的函数定义,而我只能在 avcodec.h 中找到函数声明

我正在使用 git 修订版:bfdf0f078a7463e1f304ef6fea3b25518cc45c3b

谁能告诉av_codec_set_pkt_timebase的函数定义在哪里?

最好的问候,刘易斯

0 投票
1 回答
2958 浏览

video - 使用 avcodec 打开编解码器时出错

我一直在尝试将字幕从格式SubRip(.srt)转码为MPEG4 Timed Text将它们混合到 MP4 容器中,其中已经有音频和视频。从命令行这样做ffmpeg是微不足道的:

但是,使用 avcodec,我可以打开这两个文件并从中读取,但是当我尝试打开(encoder) codec的AVCodecContextAV_CODEC_ID_MOV_TEXT时,我收到以下消息:

产生错误的代码如下:

该代码适用于所有解码器(相同的编解码器在解码模式下工作)以及其他编码器,主要是视频或音频,但它也不适用于AV_CODEC_ID_SUBRIPAV_CODEC_ID_SRT(设置编码器)。

0 投票
1 回答
213 浏览

c++ - 如何在基本视频流中寻找特定帧?

我们正在尝试开发一个媒体播放器,并且已经阅读了 dranger 提到的 [Dranger tutorial for ffmpeg 1的教程。这里提到的 api 谈到了寻找和播放容器格式。我们想要的是原始/基本视频流的播放器(我们正在使用的 M2v)。av_seek_frame 不适用于这些流,因为基本流中没有 PTS 或 DTS 值。

关于寻找基本流的任何帮助都会有很大帮助,我有要寻找的所需位置的时间码。

0 投票
1 回答
1993 浏览

init - 错误:avcodec_init();

我将尝试在 Ubuntu 14.04.2 下编译,我收到以下错误:

代码是:

我尝试了几件事,但我被卡住了。有人可以帮我吗?提前致谢

0 投票
1 回答
263 浏览

ffmpeg - avcodec_open 仅适用于未压缩格式

上下文:我有一个名为 libffmpeg.so 的文件,我从APK一个Android应用程序中获取该文件,该应用程序用于FFMPEG在多个Codecs. 因此,我认为这是使用编码选项启用编译的,并且这个 .so 文件在某处包含所有编解码器。ARM这个文件是为(我们称之为ARMEABIprofile on 的)编译的Android

我也有一个非常完整的类,其中包含可以调用API的互操作ffmpeg。无论 this 的起源是什么static library,所有呼叫响应都很好,并且大多数端点都存在。如果不是,我添加它们或修复已弃用的一个。

当我想创建一个ffmpeg Encoder时,返回的编码器是正确的。

现在,我有一个问题Codecs。问题是——假设出于好奇——我遍历所有编解码器的列表,看看我可以使用 avcodec_open 调用打开哪个编解码器......

...然后只有未压缩的编解码器在工作。(YUV、FFmpeg 视频 1 等)

我的假设是:

  • 编译为 .so 文件时缺少的选项
  • av_open_codec 调用取决于我在调用中引用的 AVCodecContext 的属性。

我真的很好奇为什么只返回一组最小的未压缩编解码器?

[编辑]

@ronald-s-bultje 的回答让我阅读了 AVCodecContext API 描述,当在编码器上使用时,有很多带有“必须由用户设置”的补充文件。为这些参数设置一个值可以AVCodecContext使大多数漂亮的编解码器可用:

0 投票
2 回答
1611 浏览

c# - 逐帧播放视频性能问题

我想在逐帧模式下播放视频(主要是带有 Motion JPEG 的 .mov)并改变帧速率。我有一个函数给我一个帧号,然后我必须跳到那里。它主要是在一个方向上,但有时会跳过几帧;速度也不是恒定的。所以我有一个计时器每 40 毫秒询问一个新的帧号并设置新的位置。我现在的第一种方法是使用 DirectShow.Net (Interop.QuartzTypeLib)。因此,我渲染并打开视频并将其设置为暂停以在图表中绘制图片

现在我将设置一个新位置

由于视频处于暂停模式,因此它将绘制每个请求的新位置(帧)。工作得很好,但真的很慢......视频一直卡顿和滞后,而不是视频源;录制的帧数足以播放流畅的视频。通过一些性能测试,我发现 LAV-Codec 是这里的瓶颈。这不直接包含在我的项目中,因为它是一个 DirectShow-Player,它将通过我安装在我的 PC 上的编解码器包进行投射。

想法:

  • 我自己直接在 C# 中使用 LAV-Codec。我进行了搜索,但似乎每个人都在使用 DirectShow,构建自己的过滤器,而不是直接在项目中使用现有的过滤器。
  • 我可以仅通过帧号获取单帧并简单地绘制它们,而不是寻找或设置时间吗?
  • 有没有其他完整的方法来归档我想做的事情?

背景:

这个项目必须是一个火车模拟器。我们录制了从驾驶舱内行驶的火车的实时视频,并知道哪个框架是哪个位置。现在我的 C# 程序根据时间和加速度计算火车的位置,返回适当的帧号并绘制该帧。


附加信息:

在 C/C++ 中还有另一个项目(不是我写的),它直接使用 DirectShow 和 avcodec-LAV,其方式与我类似,而且效果很好!那是因为我有想法自己使用像 avrcodec-lav 这样的编解码器/过滤器。但我找不到与 C# 一起使用的互操作或接口。


感谢大家阅读本文并提供帮助!:)