FFmpeg如何将视频写入文件

时间:2011-02-24 17:00:38

标签: c ffmpeg

我想要的是

 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)播放。

祝福

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

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

一些额外信息

在FFmpeg我必须

  1. 从媒体源读取媒体数据包(可能是真实文件(.avi,mov),甚至是rtsp服务器)。
  2. 然后将这些媒体数据包写入真实文件(物理.avi,.mov等文件)
  3. 我需要读者和作家。我可以读取媒体源文件(甚至根据给定的格式对数据包进行编码)。但我不能写文件......(任何玩家都可以玩)

    还有一些伪代码

    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.
    

4 个答案:

答案 0 :(得分:4)

这个链接可能对您有所帮助:

Output a media file in any supported libavformat format

我希望它有所帮助。

答案 1 :(得分:2)

现在,在FFmpeg trunk的 doc / examples / transcoding.c 中有一个新的视频转码示例,它完全符合您的需求:API example for demuxing, decoding, filtering, encoding and muxing.

这是针对当前的 ffmpeg 2.4.4

答案 2 :(得分:0)

您需要编写一个编码器来将原始数据转换为所需的视频格式

  

ffmpeg encoding sample wanted?

     

Encode audio to aac with libavcodec

答案 3 :(得分:-1)

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

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

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