问题标签 [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 回答
3968 浏览

ffmpeg - 当编解码器使用 p 帧时,av_seek_frame 会中断 avcodec_decode_video2

我试图了解如何在用 p 帧(例如 H.264)编码的视频中寻找——现在我只知道如何在用每帧都是关键帧的编解码器编码的视频中寻找(例如 MJPEG)。

给定一个时间戳,最终它应该播放该时间戳的帧。但现在,我只是想在时间戳附近播放关键帧。所以,首先——

然后是一些中间代码,包括av_read_frame. 然后 -

观察:

  • 对于某些视频,这是可行的。对于其他人,avcodec_decode_video2返回错误(负数)。工作视频示例:此处。非工作视频示例:此处

  • 对于 MJPEG 视频,这是可行的。

  • 如果我取出av_seek_frame, 以便它按顺序播放帧,它就可以工作。

0 投票
1 回答
1294 浏览

c++ - 使用非英文文件名调用 avio_open 函数无效

我一直在用libav编写基于unicode的程序,我想通过libav制作一些文件名为“中.mp4”的文件。

这个文件名不是英文,当我调用时,函数返回正整数(不失败)。

但是有“ѱ0.mp4”而不是“中.mp4”。(无效的文件名。)

怎么了?

0 投票
2 回答
10121 浏览

c++ - ffmpeg 函数 avformat_seek_file() 的问题

我正在尝试使用 ffmpeg 库在视频中寻找给定的帧。我知道有av_seek_frame()功能,但建议avformat_seek_file()改用。这里提到了类似的东西。

我知道avformat_seek_file()不能总是把你带到你想要的精确框架,但这对我来说没问题。我只想跳到最近的关键帧。所以我打开视频,找到视频流并像这样调用它:

它总是返回 0,所以我理解它是正确的完成。但是,它不能正常工作。我在调用之前和之后检查字节位置,就像这里avformat_seek_file()一样。实际上它会改变,但是每当我尝试放置不同的目标帧号时,它总是以相同的方式改变!frameNumber我的意思是即使使用不同的值,此调用后的字节位置也始终相同。显然,我做错了什么,但我不知道到底是什么。我不知道这是否重要,但我正在使用 .h264 文件。我尝试了不同的标志、不同的文件、使用时间戳而不是帧、前后刷新缓冲区等等,但它对我不起作用。如果有人能告诉我它有什么问题,我将不胜感激。

0 投票
0 回答
1053 浏览

c - Remux MPEG TS -> RTP MPEG ES

请指导我在我的程序中实现以下结果(用 C 编写):我有一个流源作为 HTTP MPEG TS 流(编解码器 h264 和 aac),它有 1 个视频和 1 个音频子流。我需要获取 MPEG ES 帧(相同的编解码器),通过 RTP 将它们发送到 RTSP 客户端。如果 libavformat 提供带有 RTP 标头的帧,那将是最好的。需要 MPEG ES,因为据我所知,黑莓手机上的媒体播放器不播放 TS(我试过了)。虽然,如果有人给我指出另一种格式,我很感激,在这种情况下更容易获得,可以容纳 h264 和 aac,并且在黑莓和其他手机上播放良好。

我已经成功完成了打开流和重新混合到 FLV 容器的其他任务。

试图用“rtp”格式打开两个输出格式上下文,也得到了帧。发送给客户。没有成功。

我还尝试将帧写入“m4v”AVFormatContext,得到帧,通过 NAL 剪切它们,在每个帧之前添加 RTP 标头,然后发送给客户端。客户端每 10 秒或更长时间显示第一帧并挂起,或播放一秒钟的视频+音频(比需要的更快)。在 VLC 播放器日志中我有这个: http: //pastebin.com/NQ3htvFi

为了简单起见,我已经缩放了时间戳以使它们以 0 开头。我将它与 VLC(或 Wowza,对不起,我不记得)将音频 TS 增加了 1024,而不是 1920 进行了比较,所以我做了额外的线性缩放以类似于其他流媒体。bigbuckbunny_450.mp4播放的包转储在这里:ftp: //rtb.org.ua/tmp/output_my_bbb_450.log

顺便说一句,在这两种情况下,我几乎都没有从 Wowza 或 VLC 复制 SDP。

得到我需要的东西的正确方法是什么?如果有一些类似于 libavformat 的库,我也很感兴趣?甚至可能处于胚胎状态。

0 投票
1 回答
1847 浏览

ns2 - av_open_input_file 返回 -2 但文件存在(NS2 中的 libav)

我尝试在 NS2 中进行模拟,在其中我读入 .wav 文件,编码为 gsm 并通过网络发送它们。我已经设法制作了一个读取 .wav、编码为 gsm 并存储在硬盘上的应用程序(经过测试,工作正常)。现在我尝试对 Network Simulator 2 进行同样的扩展,我遇到了 av_open_input_file 的问题,它一直说没有这样的文件,尽管我的 gsm 编码应用程序中的那个文件没有问题。我使用的电话:

已经尝试过不同的文件,硬编码路径、绝对路径、相对路径并将“file://”放在前面,因为 libav 显然使用了某种文件协议。然后我尝试自己打开文件:

(在应该由 av_open_input_file 调用的 libav 的 file.c 中找到此调用)像这样打开文件没有问题,一切似乎都很好,所以现在我不知道还有什么问题。

有什么建议么?

最好的问候,弗洛伦卡

0 投票
1 回答
2787 浏览

ffmpeg - libav* 解码不正确

使用 libav 保存视频中的帧。

问题是,如果你调用函数 decode 几次,那么第二次然后没有正确处理。

第一次这样的结论(一切正常):

第二(找不到流,但它们是相同的):

你能告诉错误发生在哪里吗?

主文件

视频.cpp

ffmpeg 版本

0 投票
1 回答
751 浏览

c - 通过动态链接使用 FFmpeg 的 (libavformat) RTP 数据结构

我想使用 FFmpeg 的 libavformat 提供的 RTP 数据结构(例如 libavformat/rtpenc.h 中的 RTPMuxContext),但是它们似乎不适用于以下安装:

当我查看 /usr/local/include 时,我看到了 libavformat 目录,但是那里只有几个文件:avformat.h、avio.h 和 version.h。当然,当我尝试包含 libavformat/rtpenc.h 时,我得到“错误:libavformat/rtpenc.h:没有这样的文件或目录”

我想通过动态链接到 FFmpeg 库来实现这一点(出于 LGPL 合规性等原因),但这似乎是不可能的。

是否有我缺少的配置脚本参数,或者我忽略的安装后步骤?

0 投票
4 回答
7326 浏览

c - 如何关闭 libavformat 错误消息

默认情况下,libavformat 将错误消息写入,例如stderr

Estimating duration from bitrate, this may be inaccurate

我怎样才能关闭它?或者更好的是,将它传递给我自己整洁的日志记录功能?

编辑:将 stderr 重定向到其他地方是不可接受的,因为我需要它用于其他日志记录目的,我只希望 libavformat 不写入它。

0 投票
0 回答
612 浏览

android - 将文件格式从 flv 更改为 android 将播放的任何内容

我需要获取这个在 h264 中但在 flv 容器中编码的文件,然后将其放入 mp4、3gp 或任何 android MediaPlayer 可以理解的文件格式。

我想在本地做这个。因为我不会解码或编码任何东西,所以我认为我不会浪费很多能量(我错了吗?)

我按照这里的说明http://www.roman10.net/?p=394并且可以成功编译和使用 ffmpeg 并将其与 mp4 和 3gp 文件一起使用。

但是当涉及到 flv 文件时,它会失败。我知道在 ffmpeg for android 的特定端口中没有 flv 文件的格式定义。

例如,没有 libavformat/flv.h 头文件。

也许这就是为什么它有效:

extern AVInputFormat ff_mov_demuxer;
av_register_input_format(&ff_mov_demuxer);

虽然这失败了:

问题是,隧道尽头有灯吗?有人做过类似的事情吗?有用吗?我的意思是,我总是可以将 flv 媒体文件放入 Flash 播放器中,瞧.. 问题是这将是一个特殊的解决方案,因为它不适用于所有那些运行速度较慢的设备但还不能运行 Flash 的人.

尼尔森

PS。以防万一。以下是有关我正在谈论的文件的一些信息:

0 投票
3 回答
2356 浏览

libavformat - 如何更改 libavformat 中的流索引

我是ffmpeg的新手。当某些媒体有多个音频流时,我遇到了问题。假设在 MKV 文件中,它具有三个音频流(MP3、WMA 和 WMAPro)

解复用时如何更改流索引:

所以我正在搜索类似 change_stream_index(int streamindex) 的东西,当我调用该函数时(假设 change_stream_index(2)),下一次调用 av_read_frame 将解复用 WMAPro 帧而不是 MP3。

多谢你们!