Controle do ffmpeg via script shell ou comando em programa .c [RESOLVIDO]

Iniciado por ataias, 10 de Maio de 2011, 15:00

tópico anterior - próximo tópico

ataias

Tenho seguinte problema: gravar vídeos com tempo variável. O meu objetivo é fazer um programa que grave um vídeo, que tenha como um limite um valor como 3min e possa ser parado antes por um usuário que esteja usando o terminal (não o terminal do linux, um computador com touch-screen com um programa que grave o vídeo para posterior transmissão via TV na minha universidade).
A ideia é que o programa seja feito em gtk, programado em c e o mais que for necessário.
Meu problema é na gravação do vídeo, justamente...

Eu tentei no ffmpeg:

ffmpeg tralala -t (tempo em segundos ) bla bla

Eu tive problemas com a limitação do vídeo, no meu notebook o vídeo chegou a ficar verde várias verdes e ainda sem áudio.
Eu também tentei limitar o vídeo com -r (frames por segundo) e depois -vframes (total de frames) mas no final os frames ainda estavam variando e o tempo limite acabaria ficando variável, ...

Daí pensei em executar o programa, no programa escrito em C ele chamaria um shell script que chamaria o ffmpeg. O shell script seria de fácil edição sem precisar compilar sempre, aí fica melhor ficar fora do binário. Eu tentei fazer algo como:

ffmpeg -f alsa -ac 2 -i pulse -f video4linux2 -s vga -r 30 -i /dev/video0 -vcodec mpeg4 -acodec -vframes 375 libmp3lame -ab 328k -sameq -y out.avi &


Aí ele gravava o vídeo, e ainda ia para o background. Mas... eu tentei dar um comando, para trazer para o foreground e depois um [q] para tentar parar a gravação.

fg 1 && q

Mas não finalizou o ffmpeg, e ainda deu comando não reconhecido "q". Enfim, quero parar a gravação do vídeo do ffmpeg via um comando com shell, sem uma pessoa, sem teclados. Só haverá um botão no touch-screen, se for apertado, a gravação deve ser parada. Caso contrário, parada quando chegar num tempo limite que for definido. Como fazer isso?
Dell Inspiron 15R - Intel Core i5
RAM 4Gb - HD 500Gb
Ubuntu Linux 10.10 64bits!!!! A melhor parte!

irtigor

#1
$! guarda o identificador do ultimo processo colocado em segundo plano.

----

"q"? Matar é aceitável? O que realmente precisa de explicação, não tem.

ataias

Não entendi seu comentário. É que no ffmpeg está escrito "aperte [q] para parar a gravação" (em inglês). Logo, eu imaginei (erroneamente) que pudesse ser dado o comando:
fg 1 && q , sendo o último para parar a gravação depois que saísse para o foreground. Não sei se matar seria aceitável, se o arquivo de vídeo não ficar corrompido e não houver problemas na gravação, seria uma opção. No caso, só haveria um processo em segundo plano, mas achei interessante o $!, pode ser bem útil. Obrigado.
Mais sugestões?
Dell Inspiron 15R - Intel Core i5
RAM 4Gb - HD 500Gb
Ubuntu Linux 10.10 64bits!!!! A melhor parte!

irtigor

O xdotool pode ser usado pra simular a entrada padrão, mas isso só vai servir se existir um terminal com ffmpeg em primeiro plano, caso contrário, vai ser necessário ler a api para criar um encoder.

ataias

Já rolou, tivemos de usar programação paralela, ficou show.

Obrigado pela ajuda! Até mais!
Dell Inspiron 15R - Intel Core i5
RAM 4Gb - HD 500Gb
Ubuntu Linux 10.10 64bits!!!! A melhor parte!