FFmpeg Как записать видео в файл

Я хочу

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

Я могу получить видеопакеты из файла (как AVPacket), а также декодировать и сохранять в виде изображения. (raw) (учебники FFmpeg показывают, как это сделать). Но я не могу (не знаю) записать эти видео данные в файл (другой), который может воспроизводиться медиаплеерами (например, VLC).

Лучшие пожелания

Ps: образцы реального кода будут великолепны, если это возможно...

Теперь я делаю тест с av_interleaved_write, но у меня возникла странная ошибка "non monotone timestamps" (у меня нет контроля над значениями pts медиа-источника)

Дополнительные сведения

В FFmpeg я должен

  • Прочитайте мультимедийные пакеты из медиа-источника (это может быть реальный файл (.avi, mov) или даже сервер rtsp).
  • Затем напишите эти медиа-пакеты в реальный файл (файл .avi,.mov и т.д.)

Мне нужен читатель и писатель. Я могу читать медиа-исходный файл (даже кодировать пакеты в соответствии с заданным форматом). Но я не могу писать в файл... (который может играть любой игрок)

И некоторый pseudoCode

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.

Ответы

Ответ 3

В какой-то момент я сделал что-то вроде libx264 и vorbis.

Пример кода. https://github.com/Themaister/SSNES/blob/master/record/ffemu.c

Основная идея заключается в том, что вам нужно установить метки времени в AVFrame, когда вы хотите его закодировать. Затем вы можете взять этот пакет и записать его с помощью av_interleaved_write().