问题标签 [libav]

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 投票
0 回答
961 浏览

video - libav/ffmpeg:avcodec_decode_video2() 在分离解复用和解码时返回 -1

我正在使用 libav(来自 Linux 和 Windows 上的 C++ 程序)从文件中解码视频流,使用 avformat_open_input()、av_read_frame() 和 avcodec_decode_video2() 可以正常工作(解码各种格式,如 H264 和 MPEG2)。

现在我必须分开解复用和解码。一个类将调用 avformat_open_input() 和 av_read_frame(),然后将 AVPackets 传递到另一个类读取的队列中。在那里,我使用 avcodec_alloc_context3() 来获取 avcodec_decode_video2() 所需的 AVCodecContext。我已经使用 MPEG2 视频流对其进行了测试,并且可以正常工作。

如果我尝试解码 H264 流,则会出现问题:avcodec_decode_video2() 始终返回 -1 并输出“无帧”。我知道解码这个流需要额外的数据(SPS/PPS),所以我试图从解码器中的解复用器复制原始的 AVCodecContext,但它不起作用:

  • 复制 extradata 字段的内容并设置与解码器中的默认值不同的所有其他值:返回 -1
  • 使用相同的上下文(即沿指针传递)会导致崩溃

我也尝试设置CODEC_FLAG2_CHUNKS。avcodec_decode_video2() 然后总是返回 packet.size - 3 (??) 并且 frameFinished 永远不会设置为 1。

在我看来,每当需要来自原始 CodecContext 的设置来解码 AVPackets 时,我都会在这里遇到一个普遍的问题。对于如何解决该问题的任何提示,我将不胜感激!

编辑:有时写下您的问题有助于解决它......使用上下文结构(avcodec_copy_context)的副本并仅在接收到解码帧中的副本结果后打开编解码器。有谁知道这是否安全或最好的方法?

0 投票
1 回答
6394 浏览

windows - ffmpeg 退出状态-1094995529

我正在开发一个应用程序,在 Windows 上调用该应用程序ffprobe返回某些文件的非正统退出状态。-1094995529这个退出状态是一致的,对此有一些小的讨论

为什么给出这个值,它记录在哪里?我可以期望在允许的退出状态受到更多限制的 unix 机器上,此状态会有所不同吗?

0 投票
1 回答
2135 浏览

ffmpeg - avio_set_interrupt_cb 的替代品是什么?

avio_set_interrupt_cb 在新的 ffmpeg 版本中被弃用了吗?什么是替代品?

0 投票
1 回答
1982 浏览

audio - 使用 libav/ffmpeg 正确打开音频文件

我正在尝试使用 ffmpeg 解码来自各种文件格式的音频样本。因此,我根据本次讨论中的代码开始了一些实验:How to decode audio via FFmpeg in Android我使用最新的 FFMPEG 版本(1.0)并使用https://github.com/halfninja/android-ffmpeg-x264编译它

FFMPEG 使用 enable-decoder=mp1/mp2/mp3/ogg/vorbis/wav/aac/theora 编译,没有任何外部库(例如 libmp3lame、libtheora 等)

打开 mp3 和 wav 文件可以毫无问题地生成以下输出,例如 mp3:

音频格式:mp3

音频比特率:256121

流:0(总数:1)

音频编解码器:mp3

但是当我尝试打开一个 ogg 文件时,我得到了这个:

错误查找流信息:-1(流:1)

When I manually set audioStreamIndex=0 and comment out the return statement:

Error find stream information: -1 (Streams: 1)

audio format: mp3

audio bitrate: 0

stream: 0 (total: 1)

audio codec: mp3

For m4a (AAC) I get this:

audio format: mp3

audio bitrate: 288000

stream: 0 (total: 1)

audio codec: mp1

but later it fails in avcodec_decode_audio3.

I also tried to manually force a format without success:

Is there something wrong with the loading code which makes it only work with mp3 and wav and fails for other formats?

Regards,

0 投票
1 回答
1005 浏览

libav - LibAV Mpeg_TS 流似乎不包含 I 帧

我正在尝试获取 YUV 420 流,将其转换为 MPEG2 并通过 UDP 作为传输流发送。

转换似乎工作正常,通过保存输出我可以创建一个可播放的 MPEG。在wireshark 中查看传输的数据包时,我可以看到程序关联和程序映射表(它们看起来是正确的)以及b 帧和p 帧。我看不到任何 I 帧,但可以看到 MPEG 序列标头数据包。

使用 VLC 我无法查看流(UDP://239.192.1.114:6677)

下面是一段代码,展示了视频包的转换和传输。

任何关于为什么我看不到 I 帧的想法将不胜感激。

0 投票
1 回答
916 浏览

visual-c++ - libav Windows 静态库

有人知道如何构建 libav 静态库 (.lib) 以在我的项目中使用它们吗?

0 投票
1 回答
1256 浏览

c++ - 编译为 C++ 时 libav 中的未定义符号,但不是 C

我正在尝试使用 libav 库编译一些简单的代码。

我在 Mac 上,使用 gcc 版本 4.2.1。

当我尝试将代码编译为 C 使用

然后代码编译并链接正常。但是,当我尝试将其编译为 C++ 使用

它给了我未定义的符号错误:

当我使用该-v选项运行时,运行的链接步骤是:

在这里,唯一的区别是添加-lstdc++到链接。

为什么会出现这些未定义的符号错误?是否有某些原因简单地将库添加到链接会导致这些未定义的符号?还是有其他原因导致此问题,可能与 libavformat 相关?

0 投票
0 回答
581 浏览

c++ - 在 H.263 上编码视频以通过 RTP 发送

我正在开发一个应用程序,通过 RTP 将视频发送到只能播放 H.263 (1996) 和 H263+ (1998) 的客户端。

为此,我按照以下步骤使用 libav 对视频进行了编码:(这只是代码的一部分)

最后进入我对视频进行编码的循环,问题是该程序生成的流以H.263-2000(或 H.263++)编码,即使我使用 CODEC_ID_H263 或CODEC_ID_H263P 在初始化时也会发生同样的事情。

是否可以使用 libav 在那些旧的 H.263 版本中进行编码?我什至没有使用 ffmpeg 命令来做到这一点。流始终是 h.263-2000 (PT=96)

0 投票
1 回答
114 浏览

c++ - libav 视频编码 ratecontrol.cpp:766

我在尝试使用 libav 对视频进行编码时遇到了一些麻烦。

ratecontrol.c : 766我说这个断言错误q>0.0

我不知道发生了什么,我知道字母 q 通常代表质量,其中 0 是无损的。

但在这种情况下,我就是无法把握可能出了什么问题。

我有很多关于这个的代码,在这里发布是不可能的。我正在使用带有 gpl 和 libx264 的 ffmpeg 包 1.0。我正在尝试使用 crf 值为 1 的 libx264 编码器进行编码。

我检查了输入的值,它们看起来很合理,我尝试将给定的图像保存到单独的 .bmp 文件中,一切似乎都井井有条。

编辑:

明白了,比特率与编码器不兼容。

奇怪的是它应该做这样的事情来表明这个问题..

0 投票
2 回答
1562 浏览

ffmpeg - libavcodec 如何解码音频帧?

这是我使用 ffmpeg 的 libav* 解码音频流的过程

[videofile]-->(读取音频包)--> [pkts queue]-->(解码器)-->扬声器的样本缓冲区

出于某种原因,我需要在解码器之后插入一个缓冲区

[videofile]--> (读取音频包)--> [pkts queue] --> (decoder)--> [samples buffer] --> 说话者的样本缓冲区

中的音频样本samples buffer是 LPCM 16 位。为了保存音频的 pts,sample buffer我保存了第一个样本的 pts。通过这种方式,我可以计算缓冲区中任何样本的 pts。

问题是只有当音频流包含连续的音频样本时计算才是正确的。ffmpeg 的解码音频帧是否总是包含连续的样本?