FFmpeg如何将视频写入文件

13

我想要的是什么:

 1. Get video packet from stream source
 2. Decode it
 3. And write  that decoded data as video file(avi, mpeg etc)

我能够从文件中获取视频数据包(作为AVPacket),并且可以对其进行解码并保存为图像(原始格式)(FFmpeg教程显示如何实现)。但是,我不知道如何将该视频数据写入到媒体播放器(例如VLC)可以播放的文件中。

最好提供真实的代码示例......

我现在使用av_interleaved_write进行测试,但是出现了奇怪的错误“非单调时间戳”(我无法控制媒体源的pts值)。

一些额外信息

在FFmpeg中,我需要执行以下操作:

  1. 从媒体源(可能是实际文件(.avi、.mov)或甚至rtsp服务器)中读取媒体数据包。
  2. 然后将这些媒体数据包写入实际文件(物理 .avi、.mov 等文件)中。

我需要一个读取器和一个写入器。我可以读取媒体源文件(甚至根据给定格式编码数据包)。但是我无法写入播放器可以播放的文件中。

以下是一些伪代码:

File myFile("MyTestFile.avi");

while ( source ->hasVideoPackets)
{
     packet = source->GetNextVideoPacket();
     Frame decodedFrame = Decode(packet);
     VideoPacket encodedPacket = Encode( decodedFrame);
     myFile.WriteFile(encodedPacket);
 }

或者只需编写原始文件而不进行编码解码操作。

     File myFile("MyTestFile.avi");

     while ( source ->hasVideoPackets)
     {
         packet = source->GetNextVideoPacket();
         myFile.WriteFile(packet);
     }
那么。
I can able to open MyTest.avi file with a player.

提供一个使用av_interleaved_write_frame或av_write_frame实现此功能的好例子链接,将获得悬赏奖励。 - Aditya P
请查看以下链接,该链接演示了如何使用FFMPEG库编写视频文件:https://dev59.com/JGsy5IYBdhLWcg3wyxCi#43464269 - Abdullah Farweez
3个回答

2

0

我可以使用FFmpeg库(不是CLI,而是API)对数据进行编码和解码。但是我无法使用av_interleaved_write函数将其写入实际文件,以便任何播放器都可以播放它(确保播放器具有必要的编解码器)。 - NoviceAndNovice

-1

我曾经使用libx264和vorbis做过类似的事情。

这是一个代码示例。 https://github.com/Themaister/SSNES/blob/master/record/ffemu.c

基本思路是,当您想要对其进行编码时,必须自己设置AVFrame中的时间戳。然后,您可以使用av_interleaved_write()将该数据包写入。


我无法弄清楚如何告诉“av_interleaved_write_frame”函数将数据包写入哪个物理文件(例如读取数据包并写入“mytest.avi”文件)。 - NoviceAndNovice
我想到了一个解决方案。ctx->oformat = av_guess_format(NULL, ctx->filename, NULL); 但是,由于我只有一个源文件和目标文件,我是否需要创建两个AVFormatContext:一个用于读取,另一个用于写入? - NoviceAndNovice
看起来仓库已经从网络上消失了。搜索文件名发现了https://blog.naver.com/p4violet/120150852154。 - mwfearnley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接