问题标签 [libavformat]

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 回答
732 浏览

ffmpeg - 对于 WMV 文件,avformat_find_stream_info() 显示“额外数据:剩余 8 位,值:0”消息

当我为 wmv 文件调用 avformat_find_stream_info() 时,总是会看到以下消息:
[wmv3 00FAEAE0] Extra data: 8 bits left, value: 0

之后程序按预期工作,但无论如何我想知道该消息是什么意思?谢谢!

文件信息(通过 ffmpeg -i):

代码:

0 投票
1 回答
8740 浏览

ffmpeg - 如何使用 ffmpeg 和 c++ 将自制流发布到 rtmp 服务器?

祝你们有美好的一天,人们!

我正在为 Windows 编写一个应用程序,它将捕获屏幕并通过 rtmp(用于广播)将流发送到 Wowza 服务器。我的应用程序使用 ffmpeg 和 Qt。我使用 WinApi 捕获屏幕,将缓冲区转换为 YUV444(因为它最简单)并按照文件decode_encoding.c(来自 FFmpeg 示例)中的描述对帧进行编码:

我需要将此代码生成的视频流发送到 RTMP 服务器。换句话说,我需要这个命令的 c++/c 模拟:

它很有用,但我不想将流保存到文件中,我想使用 ffmpeg 库对屏幕截图进行实时编码,并将编码帧发送到我自己的应用程序中的 RTMP 服务器。请给我一个小例子,如何正确初始化 AVFormatContext 并将我的编码视频 AVPackets 发送到服务器。

谢谢。

0 投票
1 回答
3151 浏览

c++ - 使用 libavformat 和 vcopy/acopy 混合 H.264 附件 B 和 AAC 流

我正在对来自 IP 摄像机的视频 (H.264) 和音频 (AAC) 进行一些集成工作。

我已经取得了一些进展,我可以单独存储视频和音频流,并能够使用 VLC 播放器进行播放。H.264 以附件 B 格式存储,音频使用 adts 格式的文件。

我现在正在尝试将流混合到 MP4 文件中,而不进行任何解码或编码,但到目前为止还没有找到答案。

我可以使用 ffmpeg 手动执行此操作: ffmpeg -i recording.h264 -i recording.aac -vcodec copy -acodec copy -absf aac_adtstoasc recording.mp4

如何使用 C++ 中的 ffmpeg 库执行此操作?

0 投票
1 回答
4243 浏览

video - 如何获取视频文件的 I/P/B 帧数?

我想提取视频文件的信息以获取其 I/P/B 帧的计数。如何在ffmpeg中做到这一点?或者我应该使用 libavformat 和 libavcodec 进行编程吗?非常感谢!

0 投票
2 回答
2735 浏览

ffmpeg - 如何从 ffmpeg 中的流中检索 HTTP 标头?

我目前正在 Android 上制作音频流应用程序。我正在使用 Android NDK 和 ffmpeg 来执行它到目前为止运行良好。

现在我想在流式传输时检索标题流中包含的广播元数据。显然 ffmpeg 没有提供直接的方法来做到这一点,但我很确定在技术上可以从流中检索 HTTP 标头,因为我们在流式传输时接收所有字节。

有谁知道如何使用 ffmpeg 从流中检索 HTTP 标头?

0 投票
1 回答
17885 浏览

c++ - H.264 复用到 MP4 使用 libavformat 不播放

我正在尝试将 H.264 数据复用到 MP4 文件中。将此 H.264 Annex B 数据保存到 MP4 文件中似乎没有错误,但文件无法播放。

我对文件进行了二进制比较,问题似乎出在写入 MP4 文件的页脚(预告片)的内容中。

我怀疑它必须与创建流的方式有关。

在里面:

我拥有的这个原型应用程序的一部分是为每个 IFrame 创建一个 png 文件。因此,当遇到第一个 IFrame 时,我创建视频流并写入 av 标头等:

我写出数据包:

最后关闭文件:

如果我单独获取 H.264 数据并进行转换:

除了文件的“页脚”之外,所有文件都是相同的。

我的程序的输出:readrec recording.tcp out.mp4 **** START **** 01-03-2013 14:26:01 180000 输出 #0,mp4,到“out.mp4”:流 #0:0 : 视频:h264, yuv420p, 352x288, q=2-31, 512 kb/s, 90k tbn, 25 tbc **** END **** 01-03-2013 14:27:01 102000 写了 1499 个视频帧。

如果我尝试使用 ffmpeg 转换使用 CODE 创建的 MP4 文件:

我真的不知道问题出在哪里,除了它必须与流的设置方式有关。我查看了其他人正在做类似事情的一些代码,并尝试使用此建议来设置流,但无济于事!


给我一个 H.264/AAC 混合(同步)文件的最终代码如下。首先是一些背景信息。数据来自 IP 摄像机。数据通过第 3 方 API 以视频/音频数据包的形式呈现。视频包以 RTP 有效载荷数据(无标头)的形式呈现,由 NALU 组成,这些 NALU 被重构并转换为附件 B 格式的 H.264 视频。AAC 音频以原始 AAC 形式呈现,并转换为 adts 格式以启用播放。这些数据包已被放入比特流格式,允许传输时间戳(自 1970 年 1 月 1 日以来的 64 位毫秒)以及其他一些内容。

这或多或少是一个原型,在任何方面都不干净。它可能泄漏得很糟糕。但是,我确实希望这可以帮助其他人尝试实现与我相似的目标。

全局变量:

主要的:

添加流流/编解码器,并在名为 addVideoAndAudioStream() 的函数中创建标头。这个函数是从 decodeIFrame() 调用的,所以有一些假设(不一定是好的) 1. 视频包首先出现 2. AAC 存在

decodeIFrame 是一种单独的原型,我在其中为每个 I Frame 创建缩略图。生成缩略图的代码来自:https ://gnunet.org/svn/Extractor/src/plugins/thumbnailffmpeg_extractor.c

decodeIFrame 函数将一个 AVCodecContext 传递给 addVideoAudioStream:

据我所知,一些假设似乎并不重要,例如: 1. 比特率。实际视频比特率约为 262k,而我指定 512kbit 2. AAC 频道。我指定了单声道,虽然实际输出是来自内存的立体声

您仍然需要知道视频和音频的帧速率(时基)是多少。

与许多其他示例相反,在视频数据包上设置 pts 和 dts 时,它无法播放。我需要知道时基(25fps),然后根据该时基设置 pts 和 dts,即第一帧 = 0(PPS,SPS,I),第二帧 = 1(中间帧,不管它叫什么;)) .

AAC 我还必须假设它是 16000 赫兹。每个 AAC 数据包 1024 个样本(我认为您也可以使用 AAC @ 960 个样本)来确定音频“偏移量”。我将此添加到 pts & dts。所以 pts/dts 是要回放的样本编号。您还需要确保在写入之前在数据包中设置了 1024 的持续时间。

--

我今天还发现附件 B 与任何其他播放器都不兼容,因此应该使用 AVCC 格式。

这些 URL 有帮助: Problem to Decode H264 video over RTP with ffmpeg (libavcodec) http://aviadr1.blogspot.com.au/2010/05/h264-extradata-partially-explained-for.html

在构建视频流的时候,我填写了extradata&extradata_size:

写出帧时,不要在前面加上 SPS 和 PPS 帧,只写出 I 帧和 P 帧。另外,将前4个字节(0x00 0x00 0x00 0x01)中包含的附件​​B起始码替换为I/P帧的大小。

0 投票
1 回答
2231 浏览

android - android中ffmpeg中的av_read_frame函数总是返回packet.stream_index为0

我正在使用下面粘贴的以下标准代码(参考:http ://dranger.com/ffmpeg/ )在使用 ndk 的 android 中使用 ffmpeg。我的代码使用 gcc 编译器在 ubuntu 10.04 中运行良好。但是我在android中遇到了一个问题。问题av_read_frame(pFormatCtx, &packet)总是在返回packet.stream_index=0。我已经使用各种 rtsp url 测试了我的代码,并且在所有情况下我都有相同的行为。我没有任何链接或编译问题,因为除了这个问题之外,一切似乎都运行良好。我试图从过去 2 天开始解决这个问题,但我被严重卡住了。请指出我正确的方向。

0 投票
0 回答
748 浏览

android - FFMPEG:使用 android-ndk 更改视频的采样率/比特率

您好我正在尝试使用 ffmpeg 更改视频文件的音频流的采样率。但我无法更改原始文件的音频。到目前为止,我能够分别读取音频和视频流并显示其采样率。不知道如何永久应用此效果。以下是我的 Java 代码。

和我的原生文件

0 投票
1 回答
282 浏览

android - Not able to read audio streams with ffmpeg

I am trying to solve a big problem but stuck with very small issue. I am trying to read audio streams inside a video file with the help of ffmpeg but the loop that should traverse the whole file of streams only runs couple of times. Can not figure out what is the issue as others have used it very similarly. Following is my code please check:

0 投票
3 回答
7505 浏览

ffmpeg - 如何使用 libavformat 连接 2 个具有相同编解码器的视频文件(重新混合)?

我已经从 CDN 下载了 flv 格式的视频(视频 H264 和音频 AAC),并将它们重新合成为 MP4 格式。但是视频受长度限制。所以我已经分几个部分下载了每个视频:从起点开始,在第 1 点,在第 2 点(通过在 url 中使用 seek 参数)。每个点的开始时间都比前一个点的结束时间早一点。
使用av_read_framei 扫描所有部分,发现相交的数据包不仅具有相同的大小和顺序,而且它们的 dts/pts 彼此偏移恒定值。因此,要将开始视频与从点 1 开始的视频连接起来,我必须执行以下操作:
1. 在输出文件中创建输出标头
2. 从开始视频中复制所有不相交的数据包。
3. 从点 1 开始的视频中复制所有不相交的数据包,并通过将其移动常量来更改 dts 值

如何使用 libav(不是 ffmpeg)来完成所有这些工作?我阅读了如何在不使用其他 libav 库的情况下使用 libavformat。但libav它不起作用,因为没有avformat_alloc_output_context2. libav对于像我这样的新手来说,源avconv.c代码太复杂了,无法隔离与流复制操作相关的部分。
有人可以给我举个例子:
- 打开input_file1input_file2(仅当程序与通用教程中的标准不同时才需要)
- 打开并写入具有相同容器格式和相同视频和音频格式的output_file
标头 - 将数据包从input_file1写入output_file直到数据包,例如pos == XXX
- 将数据包从input_file2写入output_file,通过常量值更改它们的 dts(或任何需要)
- 写入正确trailer

计算我之前制作的 dts 中的时间偏移。