问题标签 [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.
c++ - 使用 libavformat 通过 RTP 流式传输 H.264
在过去的一周里,我一直在尝试通过 RTP 实现 H.264 流,使用 x264 作为编码器和 libavformat 来打包和发送流。问题是,据我所知,它工作不正常。
现在我只是编码随机数据(x264_picture_alloc)并从 libx264 中提取 NAL 帧。这很简单:
nal_queue
用于将帧安全地传递给 Streamer 类,然后将帧发送出去。现在它没有线程化,因为我只是在测试试图让它工作。在对单个帧进行编码之前,我已确保初始化编码器。
但我不相信 x264 是问题所在,因为我可以在它返回的 NAL 中看到帧数据。流式传输数据是使用 libavformat 完成的,它首先在 Streamer 类中初始化:
这就是事情似乎出错的地方。av_write_header
上面似乎什么也没做;我已经使用wireshark来验证这一点。作为参考,我Streamer streamer(&enc, "10.89.6.3", 49990, 800, 600, 30, 40000);
用来初始化 Streamer 实例,enc
作为对Encoder
以前用于处理 x264 的对象的引用。
现在,当我想流式传输 NAL 时,我使用它:
此时,我可以看到 RTP 数据出现在网络上,它看起来就像我一直在发送的帧,甚至包括来自 x264 的一点版权 blob。但是,我用过的任何播放器都无法理解这些数据。VLC 不再需要 SDP 描述,这显然不是必需的。
然后我尝试通过以下方式播放它gst-launch
:
gst-launch udpsrc port=49990 ! rtph264depay ! decodebin ! xvimagesink
这将等待 UDP 数据,但是当它收到时,我得到:
错误:元素/GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0:未协商 RTP 格式。附加调试信息:gstbasertpdepayload.c(372):gst_base_rtp_depayload_chain ():/GstPipeline:pipeline0/GstRtpH264Depay:rtph264depay0:输入缓冲区需要设置 RTP 上限。这通常通过设置上游源元素(通常是 udpsrc 或 appsrc)的 'caps' 属性来实现,或者通过在 depayloader 之前放置一个 capsfilter 元素并在其上设置 'caps' 属性来实现。另请参阅 http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/rtp/README
由于我没有使用 GStreamer 进行流式传输,因此我不太确定 RTP 上限意味着什么。但是,这让我想知道我是否没有通过 RTP 发送足够的信息来描述流。我对视频很陌生,我觉得这里缺少一些关键的东西。有什么提示吗?
ffmpeg - 从 libavformat 获取 TS 数据包到缓冲区
我想捕获视频,将其压缩并复用为 mpeg2 ts。使用 ffmpeg 库,所有这些都非常简单,但我想做的不是将其写入文件,而是在缓冲区中捕获 ts 数据包并以其他方式使用此流。有没有一种简单的方法可以做到这一点?
为了立即将编码帧写入文件,我使用 av_interleaved_write_frame(oc, &pkt)。OC 是一个定义了文件名和格式的输出上下文。pkt 是一个包含压缩帧的 AVPacket。av_interlaced_write_frame 正在执行复用和写入文件。
我最终想要实现的是将相同的 ts 流写入多个文件,并开始和停止写入彼此独立的不同文件。为每个流启动一个新的复用器似乎效率低下,因为 TS 流不应该需要任何标题或正确的结尾才能正确播放(如果我读到的内容是正确的)
我有点迷失在 ffmpeg 代码中寻找好的例子,而且这些库的文档也不是很好。对此主题的任何意见表示赞赏。谢谢!
h.264 - 使用 ffmpeg 将 H.264 编码数据保存到文件中
我有来自图像采集卡的 H264 数据。使用这些数据,我已经编写了一个 RTP/H264 流媒体服务器(使用 live555)和一个 RTP/H264 客户端(使用 ffmpeg 和 live555)。
我想向我的服务器添加一个新功能:以任何格式(avi、mp4、mkv 等)将编码的 H264 数据直接保存到文件(无需转码),以便以后使用 VLC 观看视频。
对于显示客户端,基本上,我执行了:
1) 使用 ffmpeg/av_new_packet() 从 H264 数据构建数据包
2)解码H264数据ffmpeg/avcodec_decode_video2()
3) 使用 ffmpeg/sws_scale() 格式化解码帧
4) 显示
有人可以在不解码/转码数据和使用 ffmpeg 的情况下快速建议我使用视频文件保存功能吗?足以
1)选择输出上下文(格式)
2) 使用 ffmpeg/av_new_packet() 从 H264 数据构建数据包
3) 使用 ffmpeg/av_(interleaved)_write_frame() (以及 av_write_trailer() 和 av_write_header()) 保存数据包?
?
谢谢大家
c++ - 使用 ffmpeg 编码为 .MP4 的问题
所以我对此有点陌生,我正在编写一个将视频录制为 .AVI 的 WIN32 应用程序,然后我计划使用 ffmpeg 编码为 .MP4。根据我找到的样本,我做到了这一点。它编译并说它对文件进行了编码和编写,但输出文件无法打开和播放。我尝试像原始样本一样使用 MPEG1 编码,但它只会给我奇怪的颜色几秒钟。
我是否遗漏了应该对文件执行的操作?
任何在编码/ffmpeg 方面有经验的人,一些指示、建议或帮助都会让我非常感激。提前致谢!
c++ - 在 Visual Studio 2010 中链接 libavformat
我正在尝试围绕 libavformat 构建一些视频阅读代码。在这里获得编译好的 DLL 和.lib
文件后,我去构建我的代码,即使我已经链接到提供的文件中,链接器也找不到任何 libavformat 符号 。.lib
检查libavformat.lib
显示dumpbin -headers
它使用下划线前缀导出所需的函数。例如,当我想调用avformat_open_input
时,.lib 文件给出了_avformat_open_input
.
为什么会这样,为什么我不能链接预编译的 dll?
c - av_find_stream_info 适用于文件,不适用于管道
我有以下代码:
当我的输入是一个常规文件时,这很好用,并且 pFormatCtx 填充了文件中的流。但是,当我将输入设置为“管道:”时,av_find_stream_info 返回 -1。
我正在使用相同的文件并通过运行管道它
cat mpeg.ts | myApp
有任何想法吗?
谢谢, 艾丽莎
c++ - 在 C/C++ 中将 libavcodec 与 linux 一起使用时出错
问题: AVFormatContext::nb_streams 价值太小。我的 C++ 代码(错误处理、包含等省略以减少列表):
跑步:
但是“avplay”程序运行良好。
encoding - sws_scale 在较小的 x264 mp4 编码中搞砸了最后一个像素行
我正在将 PIX_FMT_ARGB 格式的图片混合到 mp4 视频中。
一切都很好,除了输出图像的最后一个像素行被搞砸了,在大多数情况下最后一行是完全黑色的,有时还有其他颜色,它似乎在某种程度上取决于它运行的机器。
我绝对确定错误必须在 sws_scale 中,因为我在缩放之前和之后保存图像。输入图像没有错误,但是在 sws_scale() 之后我保存了 yuv 图像并且错误很明显。
这是一个例子:
原来的
Yuvfile(在 sws_scale 之后)
在 Yuvfile 的底部,您将看到黑色行。
这就是我进行缩放的方式(在官方 ffmpeg 示例之后,或多或少):
我还尝试了许多不同的 SWS_ 标志,但都产生了相同的结果。
这可能是 sws_scale 中的错误还是我做错了什么?我正在使用最新版本的 ffmpeg 库。
c - 无法将 libavformat/ffmpeg 与 x264 和 RTP 同步
我一直在开发一些流媒体软件,这些软件使用 H.264 从各种摄像机和网络上获取实时信息。为了实现这一点,我直接使用 x264 编码器(使用“zerolatency”预设)并提供 NAL,因为它们可用于 libavformat 以打包到 RTP(最终是 RTSP)中。理想情况下,此应用程序应尽可能实时。在大多数情况下,这一直运作良好。
然而不幸的是,存在某种同步问题:客户端上的任何视频播放似乎都会显示一些流畅的帧,然后是短暂的停顿,然后是更多的帧;重复。此外,似乎有大约 4 秒的延迟。我尝试过的每个视频播放器都会发生这种情况:Totem、VLC 和基本的 gstreamer 管道。
我把它归结为一个有点小的测试用例:
此测试显示白色背景上的黑色线条应该平滑地向左移动。它是为 ffmpeg 0.6.5 编写的,但该问题可以在0.8和0.10上重现(从我目前测试的结果来看)。我在错误处理方面采取了一些捷径,以使这个示例尽可能短,同时仍然显示问题,所以请原谅一些讨厌的代码。我还应该注意,虽然这里没有使用 SDP,但我已经尝试使用它并获得类似的结果。测试可以编译:
可以直接用gtreamer玩:
您应该立即注意到口吃。我在 Internet 上看到的一个常见“修复”是将 sync=false 添加到管道中:
这会导致播放流畅(并且接近实时),但不是解决方案,仅适用于 gstreamer。我想从源头上解决问题。我已经能够使用原始 ffmpeg 以几乎相同的参数进行流式传输,并且没有任何问题:
很明显我做错了什么。但它是什么?
ffmpeg - 使用 ffmpeg 库提取文本字幕
我正在编写一个使用 ffmpeg 的 libav* 库的 C 程序,并使用Dranger 的教程,我可以正确解码音频和视频。目前,我正在尝试提取字幕。我实际上并不想按时解码它们并在视频上显示它们,而是实际上将字幕文本从容器中提取出来。
例如,在 cli 上,
会把屁股文件还给我。(出于某种原因, srts 只返回文本。)
我试过弄乱 AVSubtitle、avcodec_decode_subtitle2 等,但他们逐行返回字幕。我想要 srts 中的时间码、ass 中的标头信息等。我想要的是混合到容器中的整个字幕文本文件。