popen для передачи двоичных данных между процессами

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

Я делаю что-то вроде этого

ffmpeg -i "input_video.avi" -ab 56 -ar 44100 -b 1500000 -r 25 -s 800x600 -f flv - 

(Output filename “-” переводит вывод в стандартный вывод)

После открытия я использую fread () для чтения трубы.

Я могу прочитать его и содержимое моих программных streamов, когда я загрузил файл в свой браузер, он был завершен, но выходной файл не воспроизводится !!!

Я подозреваю, что труба открыта как «не двоичная» ручка, так как я открыл ее с помощью popen («”, “r”), так как «r» в fopen для открытия текстового файла.

Но я не могу открыть его с помощью «rb», как я делаю для fopen (), так как «rb» неприемлем для popen ().

Как я могу решить эту проблему?

ОБНОВИТЬ:

 #define FFMPEG_COMMAND "ffmpeg -i %s -ab 56 -ar 44100 -b 1500000 -r 25 -s 800x600 -f flv -" 

Код открытия трубы

 Opening_pipe(filename) { STREAMING_HANDLE *vfp = NULL; char command[512] = { 0 }; vfp = (STREAMING_HANDLE *)malloc(sizeof(STREAMING_HANDLE)); if(NULL != vfp) { sprintf(command, FFMPEG_COMMAND, filename); vfp->ffmpeg_pipe = popen( command, "r" ); if( NULL == vfp->ffmpeg_pipe ) { free(vfp); vfp = NULL; } } printf("Virt_dir_fopen : vfp => 0x%X\n", vfp); return vfp; } 

Код для чтения из трубы

 Reading_data_from_pipe(fileHnd, buff, buflen) { STREAMING_HANDLE *vfp = (STREAMING_HANDLE *)fileHnd; int ret_code; printf("Virt_dir_fread : Asking for %d bytes \n", buflen); ret_code = fread(buf, 1, buflen, vfp->ffmpeg_pipe ); printf("Virt_dir_fread : Returning %d bytes \n", ret_code); return ret_code; } 

Код для закрытия трубы (для полноты :))

 Closing_pipe(fileHnd) { STREAMING_HANDLE *vfp = (STREAMING_HANDLE *)fileHnd; pclose(vfp->ffmpeg_pipe); free(vfp); return 0; } 

Update-2:

По сравнению с файлами

1) File-1 => Получено путем подачи данных из ffmpeg

2) File-2 => Получено непосредственно из ffmpeg с использованием той же конфигурации

Есть различия, которые я вижу, 1) File_Duration_field в File-1 равен 0, но File-2 имеет некоторое значение. 2) File_size_field в File-1 равен 0, но File-2 имеет некоторое значение. 3) В конце файла File-1 добавлено еще 18 байт, которого нет в File-2. Похоже, что отсутствовал подробный файл file_size и file_duration.

Это выглядит естественно, не так ли? поскольку ffmpeg не знает точного file_size вывода, он мог бы помещать его как 0 в заголовок файла-1 (но все равно удивляться, почему он должен положить 0 для продолжительности в файле-1).

Моя цель – перекодировать мои видеофайлы в flv и передавать их одновременно, поэтому мне не нужно ждать конверсии или конвертировать все заранее. Но выполнение этого выглядит не так. Есть ли способ для меня сделать это ???

Любая помощь / предложение будут очень полезны и оценены.

С Уважением,

Microkernel

Выходные данные могут быть необработанными данными без контейнера. Таким образом, для приложения не существует способа узнать, как интерпретировать двоичные данные в файле.

Вы также можете попробовать использовать опцию ffmpeg pipe, чтобы увидеть, влияет ли это на результат.

Обратите внимание, что некоторые форматы (как правило, MOV) требуют, чтобы выходной протокол был доступен для поиска, поэтому они будут терпеть неудачу с протоколом вывода канала.

Я предполагаю, что вы используете Linux или какой-то другой unix. В этом случае нет разницы между открытием чего-то в двоичном режиме или текстовом режиме. Вам вообще не нужен флаг «b». Ваша проблема кроется в другом месте.

Из справочной страницы fopen :

Строка режима также может включать букву «b» либо в качестве последнего символа, либо как символ между символами в любой из двухсимвольных строк, описанных выше. Это строго совместимо с C89 и не имеет никакого эффекта; «b» игнорируется во всех POSIX-совместимых системах, включая Linux. (Другие системы могут обрабатывать текстовые файлы и двоичные файлы по-разному, и добавление «b» может быть хорошей идеей, если вы делаете I / O в двоичном файле и ожидаете, что ваша программа может быть перенесена в среды, отличные от Unix.)