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

mp4 - 如何使用 libavformat 以编程方式输出分段的 mp4 文件?

我想使用 mp4 文件格式进行直播,这对于未分段的 mp4 文件是不可能的,因为 moov atom 通常写在文件的末尾。我需要生成一个分段的 mp4 文件以通过网络传输它以进行实时流式传输。我正在使用 libavformat。问题是,我可以使用 libavformat 轻松编写未分段的 mp4 文件,但我不知道如何编写分段的 mp4 文件。那么,如何使用 libavformat 编写一个碎片化的 mp4 文件呢?

0 投票
1 回答
11327 浏览

audio - 无法将 pcm 音频存储在 .mp4 容器文件中

是否可以将 pcm 音频文件存储到 .mp4 文件中?

我使用了 ffmpeg 命令“ffmpeg -i tempA.wav -acodec copy temp.mp4”,但无法将其存储在 mp4 容器文件中。

输入 #0,wav,来自“tempA.wav”:

时长:00:01:36.51,比特率:128 kb/s

[mp4 @ 0x7d70e0] 标签 [1][0][0][0]/0x00000001 与输出编解码器 ID '65536' 不兼容

输出#0,mp4,到“temp.mp4”:

流映射:

流 #0.0 -> #0.0

无法为输出文件 #0 写入标头(编解码器参数不正确?)

在转换为.AVI (ffmpeg -i tempA.wav -acodec copy temp.avi) 和.MOV (ffmpeg -i tempA.wav -acodec copy temp.mov) 文件格式时效果很好。

0 投票
1 回答
6935 浏览

memory-leaks - ffmpeg/libavcodec 内存管理

libavcodec 文档对何时释放分配的数据以及如何释放它不是很具体。在阅读了文档和示例之后,我整理了下面的示例程序。源代码中有一些具体问题,但我的一般问题是,我是否在下面的代码中正确释放了所有内存?我意识到下面的程序在出错后不会进行任何清理——重点是最终清理。

testfile() 函数是有问题的。

具体问题:

  1. 在帧处理循环中我需要释放什么吗?或者libav会为我处理内存管理吗?
  2. av_free释放一个的正确方法是什么SwsContext
  3. av_read_frame返回 < 0 时帧循环退出。在这种情况下,完成后我还需要av_free_packet吗?
  4. 我需要av_free_packet每次通过循环调用还是会自动av_read_frame释放/重用旧的AVPacket
  5. 我可以只av_freeAVFrame循环结束时使用 s 而不是每次都重新分配它们,对吗?它似乎工作正常,但我想确认它工作正常,因为它应该工作,而不是运气。
  6. 我需要在av_free(codec)AVCodec或之后做任何其他事情avcodec_closeAVCodecContext
  7. 之后我需要这样做av_free(format)还是AVFormatContext做其他事情av_close_input_file

我也意识到其中一些功能在当前版本的 libav 中已被弃用。由于这里不相关的原因,我必须使用它们。

0 投票
1 回答
620 浏览

libavcodec - 如何使用 libav 的 RTP 功能?

我有自己的媒体引擎,用于在 SIP 平台中进行 RTP 音频流和录制。现在我需要实现 RTP 视频流和录制支持。我打算使用libav。

我搜索了使用 libav 进行视频流和录制的文档和代码片段。并且还浏览了http://libav.org/documentation.html但没有得到任何线索。

在其他与 libav 相关的地方找到的大多数代码片段(示例)都已过时。

我不想使用 RTSP 功能,只对 RTP 接口感兴趣。有没有我可以参考的文档?

任何帮助或指针表示赞赏...

谢谢,阿马尔。

0 投票
0 回答
1432 浏览

ffmpeg - FFMPEG libavformat 内部缓冲

我将 FFMPEG 用于 C++ 音频流和播放应用程序。

我使用avformat_open_input函数打开指向外部压缩音频文件的 URL,然后使用av_read_frame逐步进行流式传输。然后对于每个数据包,我直接解码数据并使用 OpenAL 在音频缓冲区中排队。

我的问题是 FFMPEG 是否在内部预缓冲来自外部 URL 的压缩数据?

即使我不调用av_read_frame ,FFMPEG 是否会继续在后台下载数据?

还是我有责任维护一个中间缓冲区,我提前下载尽可能多的数据包以避免音频播放饥饿?

如果是这样,它在内部缓冲/下载多少?我可以配置这个吗?

我一直在查看文档,但没有找到任何相关信息。

谢谢。

更新:根据这个线程http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=15&t=376 libav 应该默认预缓冲大约 5MB,具体取决于 AVFormatContext::max_analyze_duration。但是我没有注意到这种行为,如果我改变 max_analyze_duration,它似乎也没有改变。

如果我监视进程的内存消耗,在我调用 avformat_open_input 后​​它不会增加,如果我模拟慢速网络,av_read_frame 会直接停止工作,就像它没有缓冲任何数据包一样。

0 投票
2 回答
4720 浏览

c - FFmpeg - C - 编码视频 - 设置纵横比

我正在从 mp2 解码视频并编码为 mp4。

原始文件:

Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 720x576 [SAR 64:45 DAR 16:9]

结果文件:

Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 720x576 [SAR 1:1 DAR 5:4]

如您所见,分辨率没有改变,但纵横比发生了变化。

我的问题是如何设置这些值(SAR 和/或 DAR)?

0 投票
2 回答
885 浏览

ffmpeg - 单个 h264 视频流的容器

我有一个简单的 h264 编码器的代码,它输出一个原始的 264 文件。我想将其扩展为直接将视频输出到可播放的容器中;只要 VLC 可以播放,哪一个都没关系。那么,在这个原始 H264 文件周围包含一个包装器的最简单方法是什么?

我在网上看到的所有地方,人们都使用 ffmpeg 和 libavformat,但我更喜欢独立代码。我不想要像音频、字幕、章节等花哨的东西,只想要视频流。

谢谢!

0 投票
1 回答
1659 浏览

c++ - 连接损坏时出现rtsp错误?

我使用 ffmpeg libavformat 记录松下相机的 RTSP 流。我可以从一切正常的情况下获取音频和视频流,直到服务器和摄像头之间出现损坏。

  • “av_read_frame”函数没有返回任何我认为它一直在等待从相机接收帧但是,由于连接损坏,它不能返回。我希望这个函数应该完成它的任务并返回错误(连接失败或类似的东西),但它没有并且永远卡住。
  • 当连接损坏时,“avformat_open_input”函数也会出现同样的问题。因此,无法处理左函数

任何人都可以向我解释这里有什么问题以及我的代码有什么问题。我怎样才能避免这种情况下的僵局。

(环境:Win 7,VS 2010,FFMPEG:20130227-git-5d2f2c7,局域网)

0 投票
1 回答
841 浏览

audio - 带有AES加密的FFMPEG libavformat读写头

我正在使用以下 libavformat 函数读取音频文件(各种格式),然后将其写入磁盘上的新文件:

  • avformat_open_input(开始读取新流)
  • avio_open(开始写入新文件)
  • avformat_write_header(写与我开始阅读相同的标题)
  • av_read_frame(获取帧)
  • av_write_frame(将帧写入磁盘)

我想知道是否可以为此添加加密,无论是对于标题部分还是对于 while 文件。也就是说,我想在数据实际写入新文件之前加密数据,然后在下次读取之前解密。

是否有任何 FFMPEG 支持使用 AES 加密在读取时加密和在写入时解密?

如果没有,我是否可以在使用上述功能时拦截和更改正在读取或写入的数据?

我知道在 libavutil 中有一个 AES 加密/解密函数(在 aes.h 中),但我找不到任何关于如何将其放入我正在使用的其他 libavformat 函数的好信息。

谢谢

0 投票
1 回答
4045 浏览

ffmpeg - 使用 SDL 2.0 在屏幕上显示 AVFrame

我正在教程的帮助下编写一些代码,并使用 ffmpeg 和 SDL 的最新开发库。我被困在必须在屏幕上显示解码帧(AVFrame)的地方。我倾向于执行上述任务,即使用 SDL 2.0 的最新 API在屏幕上显示 AVFrame(在使用 SDL_Window 的同时使用渲染器和纹理)。坦率地说,我不是SDL_RendererSDL_Texture 以及与它们相关的功能方面的专家。但我正在阅读 SDL 2.0 官方网站上的文档并逐步完成它们。

有没有办法使用 SDL 2.0 API 执行以下操作:

  • 将原生帧格式转换为YUV风格并显示出来。

    (或者)

  • 如果可能,显示框架,而无需将其从原生格式转换。

我想使用渲染器和纹理来完成上述操作。似乎没有一种简单的方法可以与他们合作。

谁能指导我完成上述任务的步骤?

PS:虽然我没有明确尝试过,但我遇到了一些通过将 AVFrame 格式(本机)转换为 RGB 在屏幕上显示 AVFrame 的方法。但我不希望将原生帧格式(主要是 YUV)转换为 RGB,因为它的计算成本很高。

格式之间的转换由 sws_scale() 完成