问题标签 [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 投票
1 回答
1168 浏览

c++ - avcodec 质量设置

avcodec lib AVCodecAVCodecContext结构中的设置是否有任何解释?

比特率和 gop 相当明显,但我在将其余部分映射到 ffmpeg 和 x264 预设时遇到问题。

例如,ffmpeg 中的高比特率设置转储为:
vcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp =2:cmp=2:subcmp=2:preme=2:qns=2

如何将 avcodec 库设置为相同的配置?

0 投票
4 回答
18242 浏览

c++ - ffmpeg::avcodec_encode_video 设置 PTS h264

我正在尝试使用 libavcodec 将视频编码为 H264

ffmpeg::avcodec_encode_video(codec,output,size,avframe);

返回我没有正确设置 avframe->pts 值的错误。
我尝试将其设置为 0,1、AV_NOPTS_VALUE 和 90khz * framenumber 但仍然出现错误non-strictly-monotonic PTS

ffmpeg.c 示例使用 ffmpeg::av_rescale_q() 设置 packet.pts 但这仅在您对帧进行编码后调用!

当与 MP4V 编解码器一起使用时,avcodec_encode_video() 会自行正确设置 pts 值。

0 投票
1 回答
2291 浏览

ffmpeg - 如何创建解码器的完整副本?

我正在为 mpeg4 视频流的自定义实现编写视频解码器(使用 FFMPEG/AVCodec)。这个视频流的特点是它可以分成许多“子”流,创建许多基于同一父级的 P 帧。我试图解码的视频流实际上是一种“视频树”。像这样的东西:

我已经编写了一个基本解码器,当我决定遵循一条路径时它工作得很好,问题是当我尝试遵循视​​频树中的多个路径时。在这一点上,我需要“分叉”我的解码器来跟踪两个不同的视频流。拆分不仅可能发生在关键帧之后,甚至可能发生在 P 帧之后,因此我需要复制 AVCodecContext (我使用avcodec_copy_context),但它似乎是从干净状态创建新解码器.. 它似乎忽略了以前的视频状态,因此解码后的 P 帧被“应用”到一个空的视频帧。可能使用复制上下文avcodec_copy_context是不够的......有什么建议吗?如何复制解码器的上下文和完整状态?或者,有没有其他方法可以使用引用解码我的流?谢谢!

0 投票
1 回答
1603 浏览

encoding - 使用 avcodec/H264 编码实时视频时

我想用 avcodec/H264 编码实时视频。我尝试了一些设置参数。

有用。解码端很好。但是框架尺寸太大了。I-frame和P-frame大约250,000字节,B-frame不做。怎么了?

谢谢你。

0 投票
0 回答
2120 浏览

build - FFmpeg LGPL 构建

您好,我正在尝试在 LGPL 许可下构建 ffmpeg,但在创建 dll 时遇到问题。

我正在使用 MinGW 在 Windows 平台上构建源代码,并使用下面的配置选项来构建最新的快照

但是,当我从这里制作和安装时,我只得到“avdevice-53.dll”,而没有其他的,如 avcodec 或 avformat。为了制作这些文件,我还需要做些什么吗?

0 投票
2 回答
1685 浏览

build - FFMPEG 构建错误

我一直在尝试构建 ffmpeg 的 LGPL 副本,并且尝试了各种不同的配置方法。我从 ffmpeg 站点下载了最新的源代码并使用了以下简单的配置

但是,每次我尝试构建它时,我只会得到“avdevice-53.dll”和这样的错误消息

我究竟做错了什么?

0 投票
0 回答
642 浏览

c++ - FFmpeg 获取标题大小

问题是从 ffmpeg 中的格式上下文(AVFormatContext)获取标题大小。

现在我正在使用第一个数据包位置来获取它:

没有阅读框架有更好的方法吗?

0 投票
0 回答
1033 浏览

ffmpeg - libavcodec 将 AVFrames 解码到 FIFO 缓冲区

我的目标是解码视频文件的多个帧,将解码后的帧累积到 FIFO 缓冲区中,然后再读取它们。我将数据包解码为我的 AVFRame mFrame:

avcodec_decode_video2(mCodecContext,mFrame,&frameFinished,&mPacket);

通常我可以将 YUV 帧从 mFrame->data[n][0] 复制到我的 FIFO 缓冲区,但我只是想尽可能地减少 memcpy 。因此,我不想复制 mFrame->data[n][0] 我只想将 mFrame(它比它指向的帧小得多)存储在缓冲区中,并且在读取时我可以获取它并到达数据。

我试图这样做,但没有奏效。AVFrames 是从缓冲区中获取的,但是当您在屏幕上显示它们时,视频就像冻结一样。您可能认为我使用相同的 mFrame 并在每次解码数据包时覆盖它,但我不是。我每次在解码循环中都创建一个新的 AVFrame*。

这个问题与 avcodec 的工作方式有关吗?有任何想法吗?

谢谢迈克

0 投票
1 回答
2306 浏览

audio - 将较大的音频文件编码为 .mpg 时,av_write_frame 失败

我正在将实时渲染的视频数据和现有的 .wav 文件编码为 mpg 文件。

为此,我首先编写所有音频帧,然后是来自渲染引擎的视频帧。对于较小的 .wav 文件(< 25 秒),一切正常。但是,一旦我使用更长的 .wav 文件,av_write_frame(在写入音频帧时)在写入大约 100 帧后就会返回 -1。它永远不是失败的同一帧,也永远不是最后一帧。我测试过的任何播放器都可以完美播放所有测试文件。

我正在关注复用示例(或多或少)。

这是我编写音频帧的函数:

所以“写入音频帧时出错。结果:-1”是我在一些帧之后总是得到的。

这是我的 get_audio_frame 函数:

最后,这是我编写所有音频帧的循环(不要担心 .wav 标头,我在该循环之前跳过了它):

如您所见,我正在输出数据包中的几乎所有内容并检查是否存在任何可能的错误。除了 av_write_frame 在我编码较长的音频文件一段时间后失败之外,一切似乎都很好。我正在跟踪的所有数据包值对于所有帧都是 100% 相同的(显然,数据指针除外)。此外,如前所述,对于较短的 fp_sound_input 文件,相同的过程可以完美地工作。avcodec_encode_audio2() 和 avcodec_fill_audio_frame() 也永远不会失败。

我用于编码的编解码器是 CODEC_ID_MPEG2VIDEO(视频)和 CODEC_ID_MP2(音频)。.wav 文件保存在 PCM 16 LE 中(都使用完全相同的编码)。

这里有什么问题?

0 投票
1 回答
44021 浏览

video - 了解视频帧中的 PTS 和 DTS

从 avi 转码为 mp4(x264) 时出现 fps 问题。最终问题出在 PTS 和 DTS 值中,因此在 av_interleaved_write_frame 函数之前添加了第 12-15 行:

看了很多帖子还是不明白:

  1. outStream->codec->time_base= 1/25 和outStream->time_base= 1/12800。第一个是我设置的,但我不知道为什么以及谁设置了 12800?我注意到在第 (7) 行outStream->time_base= 1/90000 之前和之后它变为 1/12800,为什么?当我从 avi 转码为 avi 时,意味着将第 (2) 行更改为avformat_alloc_output_context2(&outContainer, NULL, "avi", "c:\\test.avi";,因此第 (7) 行之前和之后outStream->time_base始终保持 1/25,而不像在 mp4 情况下那样,为什么?
  2. outStream->codectime_base of和有什么区别outStream
  3. 要计算 pts av_rescale_q:需要 2 个 time_base,将它们的分数相乘,然后计算 pts。为什么会这样?正如我调试的那样,encodedPacket.pts它的值增加了 1,那么如果它确实有值,为什么要改变它呢?
  4. 开始时 dts 值为 -2 并且在每次重新缩放后它仍然有负数,但尽管如此视频播放正确!不应该是积极的吗?