2015-08-22 3 views
2

Этот вопрос связан с моим предыдущим вопросом: Converting raw frames into webm live streamFFmpeg выход pipeing именованным окно труба

Я хочу трубы видео в FFmpeg и читать его обратно через другую трубу, но я не могу трубу выхода ffmpeg.exe к именованному каналу на окнах.

Мое определение труб в C#:

NamedPipeServerStream p_to_ffmpeg; 
NamedPipeServerStream p_from_ffmpeg; 
p_to_ffmpeg = new NamedPipeServerStream("to_ffmpeg", PipeDirection.Out, 1, PipeTransmissionMode.Byte); 
p_from_ffmpeg = new NamedPipeServerStream("from_ffmpeg", PipeDirection.In, 1, PipeTransmissionMode.Byte); 

И тогда я начинаю ffmpeg.exe в отдельном процессе, со следующими параметрами: -f rawvideo -vcodec rawvideo -video_size 656x492 -r 10 -pix_fmt rgb24 -i \\.\pipe\to_ffmpeg -c:v libvpx -pass 1 -f webm \\.\pipe\from_ffmpeg

ffmpeg.exe отказывается писать трубы со следующим ошибка: File '\\.\pipe\from_ffmpeg' already exists. Overwrite ? [y/N]

Когда я заменить «выходную трубу» с именем файла, он работает как шарм: -f rawvideo -vcodec rawvideo -video_size 656x492 -r 10 -pix_fmt rgb24 -i \\.\pipe\to_ffmpeg -c:v libvpx -pass 1 -f webm output.webm

Как получить ffmpeg для записи в именованный канал в Windows?

Edit: Когда я заставляю писать трубы с -y вариант FFmpeg, я получаю следующее сообщение об ошибке: Could not write header for output file #0 (incorrect codec parameters ?): Error number -32 occurred

+1

уронить '1' -pass параметр, потому что вы» не делайте двухпроходную кодировку и отправляйте полный консольный вывод, пожалуйста. – aergistal

+0

@aergistal: Спасибо за ваш комментарий. Кажется, я исправил проблему. Я должен был указать размер буфера трубы. Зачем мне бросать '-pass 1'? Я думал, что этот вариант будет специально гарантировать, что libvpx выполняет только один проход. Теперь я столкнулся с проблемой, что ffmpeg перестает обрабатывать. Но я не могу исключить, что это не проблема с принимающей трубкой, потому что блок блокирует функцию чтения. – Lucas

+0

@aergistal: console output: 'Input # 0, rawvideo, from '\\. \ Pipe \ to_ffmpeg': Продолжительность: N/A, начало: 0.000000, bitrate: 77460 kb/s Stream # 0: 0: Video : rawvideo (RGB [24]/0x18424752), rgb24, 656x492, 77460 k b/s, 10 tbr, 10 tbn, 10 tbc [libvpx @ 03a9ff80] v1.4.0 Выход # 0, webm, to '\\ . \ pipe \ from_ffmpeg ': Метаданные: encoder: Lavf56.40.101 Поток № 0: 0: Видео: vp8 (libvpx), yuv420p, 656x492, q = -1-1-1, pass 1, 200 kb/ s , 10 fps, 1k tbn, 10 tbc Метаданные: encoder: Lavc56.58.100 libvpx Отображение потока: Поток # 0: 0 -> # 0: 0 (rawvideo (native) -> vp8 (libvpx)) ' – Lucas

ответ

1

Похоже, что проблема может быть решена путем добавления опции -y к команде FFmpeg и указания размер буфера для трубы.

Моя команда FFmpeg (см комментарий aergistal почему я удалил -pass 1 флаг): -y -f rawvideo -vcodec rawvideo -video_size 656x492 -r 10 -pix_fmt rgb24 -i \\.\pipe\to_ffmpeg -c:v libvpx -f webm \\.\pipe\from_ffmpeg

и определение именованного канала следующим образом:

p_from_ffmpeg = new NamedPipeServerStream(pipename_from, 
    PipeDirection.In, 
    1, 
    PipeTransmissionMode.Byte, 
    System.IO.Pipes.PipeOptions.WriteThrough, 
    10000, 10000); 
Смежные вопросы