Сохранение потока RTP H.264 без перекодирования? - PullRequest
3 голосов
/ 18 октября 2010

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

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

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

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

Ответы [ 3 ]

1 голос
/ 18 октября 2010

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

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

-vcodec copy
1 голос
/ 07 марта 2012

Вы можете взглянуть на исходный код x264.Я искал контейнер, который может содержать уже сжатые пакеты H264 (поступающие с IP-камеры, поэтому подход «запись в файл и затем преобразование» мне тоже не подходит).Там вы можете найти реализации контейнеров raw, MP4, Matroska и FLV.Вот ссылка: http://www.videolan.org/developers/x264.html

1 голос
/ 18 октября 2010

Ваша программа могла бы передать самому rtp через ffmpeg - даже вызывая его, используя popen3().

Похоже, вам нужно использовать промежуточный файл SDP - я предполагаю, что вы можете указать файл, который вы создали как именованный канал или с tmpfile(), в которую ваше приложение пишет - используя файл в качестве посредника.

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

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); следовательно, у вас не будет потери качества, и это будет невероятно быстро.

...