FFmpeg如何将视频写入文件

Nov*_*ice 13 c ffmpeg

我想要的是

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

我可以从文件中获取视频数据包(如AVPacket),也可以解码并保存为图像.(原始)(FFmpeg教程显示如何操作). 但我不能(不知道)将视频数据写入可由媒体播放器(如VLC)播放的文件(其他).

最好的祝愿

Ps:如果可能的话,真正的代码样本会很棒......

现在我用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);
 }
Run Code Online (Sandbox Code Playgroud)

或者只是编写没有编码解码的原始文件

     File myFile("MyTestFile.avi");

     while ( source ->hasVideoPackets)
     {
         packet = source->GetNextVideoPacket();
         myFile.WriteFile(packet);
     }
Run Code Online (Sandbox Code Playgroud)

然后

I can able to open MyTest.avi file with a player.
Run Code Online (Sandbox Code Playgroud)

Mai*_*ter -1

我在某个时候使用 libx264 和 vorbis 做了类似的事情。

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

AVFrame基本思想是,当您想要对其进行编码时,您必须自己设置时间戳。然后你可以拿起那个数据包并用 写入它av_interleaved_write()