Ответ 1
Вероятно, эта ссылка может вам помочь:
Вывести мультимедийный файл в любом поддерживаемом формате libavformat
Надеюсь, это поможет.
Я хочу
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 я должен
Мне нужен читатель и писатель. Я могу читать медиа-исходный файл (даже кодировать пакеты в соответствии с заданным форматом). Но я не могу писать в файл... (который может играть любой игрок)
И некоторый 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.
Вероятно, эта ссылка может вам помочь:
Вывести мультимедийный файл в любом поддерживаемом формате libavformat
Надеюсь, это поможет.
Теперь есть новый пример перекодирования видео в doc/examples/transcoding.c из FFmpeg trunk, и он делает именно то, что вам нужно: API для демонстрации, декодирования, фильтрации, кодирования и мультиплексирования.
Это для текущего ffmpeg 2.4.4
В какой-то момент я сделал что-то вроде libx264 и vorbis.
Пример кода. https://github.com/Themaister/SSNES/blob/master/record/ffemu.c
Основная идея заключается в том, что вам нужно установить метки времени в AVFrame
, когда вы хотите его закодировать. Затем вы можете взять этот пакет и записать его с помощью av_interleaved_write()
.
вам нужно написать кодировщик для преобразования необработанных данных в требуемый формат видео