问题标签 [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.
ffmpeg - 如何获取 DVD 中的标题和章节信息?
我发现了很多关于使用 ffmpeg 创建 DVD 菜单的问题,但我没有找到任何关于以编程方式访问 DVD 结构信息的问题。当我使用 libav(或 FFmpeg)库时,我可以打开 DVD 映像(iso 文件)并访问视频、音频和字幕流。但我找不到任何 API。
我可以使用 VLC 播放器(以及 libvlc 库)播放视频并找到信息。但我需要以编程方式对音频和字幕流进行一些处理。我不想使用 SmartRipper 之类的工具拆分 VOB,然后才进行处理。
libav(ffmpeg) 是否包含任何用于处理 DVD 菜单的 API?如果不是,您能否推荐任何其他可用于以一帧(样本,AVPacket)精度获取有关标题(章节)开始和结束时间的信息的库?
我听说过 libdvdnav 库,但我不知道它是否适合我。我是 libav 和 DVD 格式内部的新手。
c - 通过 RTSP 传输视频和音频
我需要实现允许连接到两种类型的客户端的服务器。第一种类型必须将实时视频和音频流式传输到服务器。第二种类型必须从服务器流式传输此视频。我为视频选择了 h.264 编码,为音频选择了 vorbis ogg 编码。我想使用 RTSP 协议将视频从第一类客户端流式传输到服务器。我已经使用 ffmpeg 中的“libavformat”实现了客户端部分。我的代码如下所示。
VNetworkAbstractionLayer 是这样定义的:
现在我需要实现服务器。但我在 libavformat 中没有找到任何“监听”方法。谁能解释我如何实现 RTSP 服务器。可能我可以使用任何其他图书馆吗?
ffmpeg - avio_set_interrupt_cb 的替代品是什么?
avio_set_interrupt_cb 在新的 ffmpeg 版本中被弃用了吗?什么是替代品?
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,
visual-c++ - Windows 的 libavcodec 中的内存泄漏?
我正在为Windows使用 libavcodec,并且avformat_open_input()
似乎有严重的内存泄漏。如果我打开 5,000 个视频,操作系统会报告应用程序退出时未释放的 2 GB RAM 消耗。这是代码:
上面的代码位于从 C# 调用的类库中。我正在使用托管 C++ 来调用 libavcodec 库。流程是 C# -> 托管 C++ -> libavcodec。我正在使用 DLL 和动态链接。这是一个单线程应用程序。正如预期的那样,当我使用线程时,泄漏会增加。
我尝试了以下方法:
- 我已经尝试了几个 32 位版本并且内存泄漏是一致的。
- 使用
NULL
而不是&dict
. avformat_open_input()
使用相同的文件名调用5,000 多次,不会泄漏内存。- 使用组合
avformat_alloc_context()
和avformat_free_context()
. 我找不到释放内存的组合。
c - 如何在不接触ffmpeg的情况下将传入的帧写入文件?
我能够从 av_open_input_file 读取帧并使用另一个编解码器对其进行解码和重新编码并保存到文件中。
现在,我想要同样的东西,除了我不想解码或重新编码。我想在刚刚读取的帧上执行 av_interleaved_write_frame 到文件。为此,我需要设置 AVOutputFormat
AVOutputFormat *fmt; fmt = av_guess_format(NULL, 文件名, NULL);
但是,我不能提供文件名,因为它是一个远程流。那么,有没有办法从已经读取输入帧的当前 AVFormatContext 生成 AVOutputFormat ?所以我可以以正确的方式从它的任何部分(不一定从头开始)将相同的帧写入输出文件。
总结一下:我需要将刚刚读取的帧写入文件而不进行解码和重新编码。(我将再次打开该文件以便能够播放该文件)
有任何想法吗?
ffmpeg - VLC:“avcodec 错误:延迟视频超过 5 秒”
我正在将 mpeg4 视频混合到 avi 容器。视频流约为 4fps,所以我设置AVCodecContext
time_base
为 1/4 ( formatContext->streams[0]->codec->time_base
...) ,然后重新调整每个帧的时间戳,因为原始时间戳以毫秒为单位。我分配给数据包的结果值pts
和dts
.
当我用 VLC 播放这个 avi 时,视频不流畅,并且我反复收到以下消息:
avcodec 错误:超过 5 秒的延迟视频 -> 丢帧(电脑太慢?)
上面的pts/dts计算有问题吗?
下表演示了如何重新缩放时间戳(原始->重新缩放)
ffmpeg - libavcodec 如何解码音频帧?
这是我使用 ffmpeg 的 libav* 解码音频流的过程
[videofile]-->(读取音频包)--> [pkts queue]-->(解码器)-->扬声器的样本缓冲区
出于某种原因,我需要在解码器之后插入一个缓冲区
[videofile]--> (读取音频包)--> [pkts queue] --> (decoder)--> [samples buffer] --> 说话者的样本缓冲区
中的音频样本samples buffer
是 LPCM 16 位。为了保存音频的 pts,sample buffer
我保存了第一个样本的 pts。通过这种方式,我可以计算缓冲区中任何样本的 pts。
问题是只有当音频流包含连续的音频样本时计算才是正确的。ffmpeg 的解码音频帧是否总是包含连续的样本?
video - 如何在不使用其他 libav 库的情况下使用 libavformat?
我想要一个简单的工作示例,仅使用 libavformat 来复用视频。有很好的示例(doc/examples/muxing.c)显示了使用 libavcodec 进行编码、使用 libavformat 进行复用以及使用 libavio 保存数据。但是,我所知道的没有一个例子是单独使用 libavformat,在缓冲区中输入编码数据并在缓冲区中获取混合数据。
困难有两方面:一是添加流 withavformat_new_stream(AVFormatContext *s, const AVCodec *c)
需要对编解码器的引用;第二,muxing 的输出被传递给AVFormatContext->pb
which 是一个AVIOContext*
. 因此,似乎没有(明显的)方法可以将 libavformat 从其他 libav 库中解脱出来。
另请参阅:这个问题提到了一种不使用 libavio 的方法:Get TS packet into buffer from libavformat