Сохранение потока H.264 RTP без перекодирования?

Мое приложение C++ получает видеопоток H.264 RTP.

Прямо сейчас он декодирует поток, сохраняет его в файл YUV, а позже я использую ffmpeg для перекодирования файла во что-то подходящее для просмотра на ПК с Windows (например, Mpeg4 AVI).

Разве нельзя сохранить поток H.264 в контейнер AVI (или аналогичный) без необходимости его декодирования и повторного кодирования? Для просмотра потребуется декодер H.264 на ПК, но он должен быть намного эффективнее.

Как это можно было сделать? Есть ли библиотеки, поддерживающие это?


person Gene Vincent    schedule 17.10.2010    source источник
comment
Я думаю, что mencoder может взять H.264 и поместить его в контейнер AVI без декодирования, с -ovc copy. mencoder имеет открытый исходный код, так что вы можете посмотреть там.   -  person liori    schedule 18.10.2010
comment
@liori Да, весь исходный код размером 10 МБ - это OpenSource ... ;-)   -  person Gene Vincent    schedule 18.10.2010


Ответы (2)


использование ffmpeg правильно, но ответы, опубликованные до сих пор, не кажутся мне правильными.

правильный переключатель должен быть:

-vcodec copy
person The Surrican    schedule 18.10.2010

Ваша программа может передавать сам rtp через ffmpeg, даже вызывая его с помощью popen3().

Кажется, вам нужно использовать промежуточный файл SDP — я предполагаю, что вы можете указать созданный вами файл как именованный канал или с помощью tmpfile()< /a> в который пишет ваше приложение, используя файл в качестве посредника.

Командная строка будет выглядеть что-то вроде:

int p[3];
const char* const out_fmt = "avi";
const char* cmd[] = {"ffmpeg","-f",,"-i",temp_sdp_filename,"-vcodec","copy","-f",out_fmt,"-",NULL};
if(-1 == popen3(p,cmd)) ...
// write the rtp that you receive to p[STDIN_FILENO]
// read the avi from p[STDOUT_FILENO]
// read any messages and error text from p[STDERR_FILENO] 

Я считаю, что в этом случае ffmpeg достаточно умен, чтобы переупаковать контейнер (поток rtp против AVI) без перекодирования видео и аудио (это переключатель -vcodec copy); следовательно, у вас не будет потери качества, и это будет молниеносно быстро.

person Will    schedule 18.10.2010
comment
Мой ffmpeg допускает только формат rtp для вывода, но не для ввода. ТАКЖЕ, я считаю, что для чтения со стандартного ввода ffmpeg нужно -i -, а не просто -. - person Gene Vincent; 22.10.2010
comment
@ Джин Винсент, да, гугление дает небольшой намек - person Will; 22.10.2010