我正在尝试使用ffmpeg,并且在过去的一个月里做了很多实验。 我无法通过。使用FFmpeg真的很难吗?
我的要求很简单,如下所示。 如果ffmpeg是合适的,或者我自己实现(使用可用的编解码器库),请指导我。
现在我将举一个具体的例子。
假设我有一个文件small.webm,包含VP8和OPUS帧。
我只使用av_read_frame api读取音频帧(OPUS)(然后检查流索引并仅过滤音频帧)
所以现在我有数据缓冲区(编码)作为packet.data,编码数据缓冲区大小为packet.size(如果错误,请纠正我)
这是我的第一个疑问,每次音频包的大小都不一样,为什么不同。有时数据包大小低至54字节,有时为420字节。对于OPUS,框架尺寸会不时变化吗?
接下来说以某种方式从数据包中提取单个帧(实际上不知道如何提取单个帧)并将其发送给远程人员。
现在,远程人员需要将缓冲区写入文件。要编写文件,我们可以使用av_interleaved_write_frame或av_write_frame api。他们都把AVPacket作为参数。现在我可以拥有一个AVPacket,设置其数据和大小成员。然后我可以调用av_write_frame api。但这不起作用。原因可能是应该在数据包中设置其他成员,如ts,dts,pts等。但我没有这样的信息来设置。
有人可以帮助我了解FFmpeg是否是正确的选择,还是应该编写自定义逻辑,例如解析opus文件并逐帧获取。
答案 0 :(得分:2)
现在,远程人员需要将缓冲区写入文件。写文件 我们可以使用av_interleaved_write_frame或av_write_frame api。两者的 他们把AVPacket作为参数。现在我可以拥有一个AVPacket,设置它 数据和大小成员。然后我可以调用av_write_frame api。但那 不起作用。原因可能是应该在数据包中设置其他成员 像ts,dts,pts等。但是我没有这样的信息来设置。
是的,你这样做。它们位于您从发送方的解复用程序中收到的原始数据包中。您需要序列化此数据包中的所有信息,并在接收器中相应地设置每个值。