Ir ao conteúdo

Posts recomendados

Postado

Estou desenvolvendo um site onde um determinado usuario envia o Vídeo para o site e outro usuario clica em baixar e eu quero que o Vídeo seja baixado com a foto e o nome do usuario que enviou o Vídeo como se fosse uma marca d'agua no Vídeo, futuramente estou pensando em adicionar a foto de perfil do usuario dentro do Vídeo na hora da reprodução , também como se fosse uma marca d'agua, posso fazer isso usando .PHP? como posso fazer isso?

 

arquivos.zip

  • Haha 1
Postado

@Duncan o ffmpeg esta instalado no sistema,mas não esta fazendo do jeito que eu quero,se por o Vídeo pra baixar normalmente,ele ate baixa,mas quando eu acresento a opção de por o nome de usuario que postou o Vídeo e a foto tambem,ele ja não funciona,ate chega a baixar o Vídeo com menos de 1kb , mas nenhum media player é capaz de reproduzir o Vídeo,ja ate fiz o teste no meu sistema operacional,funciona normal,mas quando ponho no site php,ja não funciona...por isso vim aqui pedir ajuda a vocês 😕

  • Moderador
Postado

@Carlos FW Informatica 

 

Como você usou a biblioteca ffmpeg?

 

Aqui vai um exemplo funcional... eu testei e funciona:

 

arquivo  watermark.php

function addWatermark($videoPath, $outputPath, $profileImagePath, $username) {
        // Caminho para o binário de FFmpeg 
        $ffmpegPath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\ffmpeg\\bin\\ffmpeg.exe'; 
		
	// Caminho para uma imagem temporária
        $tempImagePath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\tmp\\temp_image.png'; 

        // Caminho para o arquivo da Fonte .TTF
        $fontPath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\fonts\\Roboto-Regular.ttf'; 
    
        // Cria a imagem temporária com a imagem do usuário e o nome do usuário 
        $image = imagecreatefrompng($profileImagePath);
        if (!$image) {
            throw new Exception("Erro ao criar imagem da foto de perfil.");
        }
    
        // Habilita a mesclagem alpha e salva o canal alpha. Preserva as cores originais e transparência(se houver)da imagem
        imagealphablending($image, true);
        imagesavealpha($image, true);
    
        // Aloca a cor para o texto
        $black = imagecolorallocate($image, 0, 0, 0); // 0, 0, 0 é preto nos padrões RGB
		
	/*Insere o texto na imagem.  
	*  O "20" é o tamanho da fonte em px
	*  O "0" é horizontal
	*  O "10" é o eixo X do ponto de origem do texto (a distância do texto a partir do lado esquerdo da imagem).
	*  O 30: é o eixo Y do ponto de origem do texto (a distância do texto a partir do topo da imagem).
	*/
        imagettftext($image, 20, 0, 10, 30, $black, $fontPath, $username); 
        imagepng($image, $tempImagePath);
        imagedestroy($image);
    
        // Se certifica que a imatem temporária foi criada
        if (!file_exists($tempImagePath)) {
            throw new Exception("Imagem temporária não criada.");
        }

  
	//Linha de comando para conversão do vídeo com a imagem e texto em marca d'agua  
        $cmd = "\"$ffmpegPath\" -i \"$videoPath\" -i \"$tempImagePath\" -filter_complex \"overlay=10:10\" \"$outputPath\" 2>&1";
        
        // Executa a linha de comando e captura a saída
        exec($cmd, $output, $returnVar);
    
        // Verifica se o comando FFmpeg funcionou
        if ($returnVar !== 0) {
            throw new Exception("Error adding watermark: " . implode("\n", $output));
        }
    
        // Remove a imagem temporária para liberar memória
        unlink($tempImagePath);
    }

 

Lembrando que este exemplo, é para localhost...  quando você for colocar online, substitua os caminhos, para os caminhos corretos do seu servidor.
PS: Este jeito é de modo procedural e simples, se quiser algo mais enxuto e robusto, sugiro tentar a dica que o colega @Duncan sugeriu.
De qualquer forma, teste deste modo que eu postei.. se seguir exatamente como eu fiz.. vai funcionar como você quer.. e aí é só implementar no seu site.. com as devidas mudanças certas.

 

Arquivo GerarMarca.php

<?php
	//Chama o arquivo watermark.php contendo a função
	include 'watermark.php';

	try {
      	// User's username
    	$username = 'DiF'; 
      	
      	//Mesclei o nome do usuário, com a data e também uma id única 
      	$videoName = $username.'_' . date('m-d-Y_hia').'_' . uniqid() . '.mp4';
      
      	// Caminho do Vídeo a ser convertido(input) 
    	$videoPath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\upload\\Vídeo.mp4'; 
      
      	// Caminho para onde o Vídeo convertido será salvo(output)
    	$outputPath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\convertido\\'.$videoName; 
    
      	// Caminho da imagem do usuário
    	$profileImagePath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\userProfile\\usuario_foto_perfil.png'; 
        	

	//Chama a função contendo os parâmetros: caminho do Vídeo, caminho da saida, o caminho da imagem e o nome de usuário 
	addWatermark($videoPath, $outputPath, $profileImagePath, $username);

    	echo "Marca d'agua adicionado com sucesso!";
	} catch (Exception $e) {
	  echo "Error: " . $e->getMessage();
	}

?>

 

Testei aqui e funciona corretamente...  Então na hora de você criar o link para download, você aponta para o diretório onde é o output.... aí você pode personalizar gerando um nome de arquivo de Vídeo com o nome do usuário... data e hora se quiser..  ao invés de só "video_convertido.mp4"

 

Lembrando que você deve colocar os arquivos do FFmpeg dentro da pasta no seu servidor.. exatamente como eu deixei.. vou deixar uma imagem de referência de como ficou a estrutura dos arquivos:

 

spacer.png

spacer.png

 

Meu teste aqui  gerei um Vídeo de uma gamplay de star wars fallen order..  coloquei meu avatar e meu nome de usuário com os códigos acima:
Nome do arquivo gerado: DiF_07-10-2024_0955am_668e3e788cc05.mp4
spacer.png

Postado
Em 10/07/2024 às 02:53, DiF disse:
  // Caminho para o binário de FFmpeg 
        $ffmpegPath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\ffmpeg\\bin\\ffmpeg.exe'; 
		
	// Caminho para uma imagem temporária
        $tempImagePath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\tmp\\temp_image.png'; 

        // Caminho para o arquivo da Fonte .TTF
        $fontPath = 'D:\\Desenvolvimento\\EasyPHP-Devserver-17\\eds-www\\watermark\\fonts\\Roboto-Regular.ttf'; 
    

aqui voce pega os arquivos locais é isso?que eu queria que viesse a foto de perfil do usuario do site,a maneira que estou usando o ffmpeg esta nos dois arquivos zipados que deixei la em cima.

  • Moderador
Postado

@Carlos FW Informatica Eu fiz esse exemplo meramente prático.   Mas no seu caso, é só fazer uma consulta SQL no banco de dados e pegar a imagem contida no diretório do servidor.

Lembrando, que nas boas práticas,  nunca armazene as imagens diretamente no banco de dados.

 

Por isso, ao fazer o upload da imagem do usuário por exemplo,  grave no banco de dados o nome  e a extensão da imagem... e por php, você monta o caminho do servidor e puxa a imagem para inserir no Vídeo junto com o nome do usuário...

 

exemplo 1:

 

<?php
     //Inicia a sessão
     session_start();
  
     //Resgata o ID do usuário na sessão ao ter feito o login
     $id = $_SESSION["id"];
     
	//Chama o arquivo watermark.php contendo a função
	include 'watermark.php';
    include 'conexao.php';


   $sql = "SELECT usuario.nomeUsuario, 
   				   usuario.fotoPerfil
                   FROM usuario 
            WHERE usuario.ID = $id";


$consulta = mysqli_query($conexao, $sql);

$dados = mysqli_fetch_object($consulta);
$username  = $dados->nomeUsuario;
$fotoPerfil = $dados->fotoPerfil;
   
$sqlVideos = "SELECT videos.Vídeo 
              FROM videos 
              INNER JOIN usuario ON usuario.ID = videos.IDusuario 
              WHERE usuario.ID = $id";

$caminho = "upload/";
$caminhoFotoUsuario = "upload/usuario_" .$id;
$caminhoVideoConvertido = "VideoConvertido/";
   
$consultaVideos = mysqli_query($conexao, $sqlVideos);
 while($dados2 = mysqli_fetch_object($consultaVideos)):
    $Vídeo = $dados2->Vídeo; 
    echo $caminho . $Vídeo ."<br/>";

	try {
      	//Mesclei o nome do usuário, com a data e também uma id única 
      	$videoName = $username.'_' . date('m-d-Y_hia').'_' . uniqid() . '.mp4';
      
      	// Caminho do Vídeo a ser convertido(input) 
    	$videoPath = $caminho . $Vídeo; 
      
      	// Caminho para onde o Vídeo convertido será salvo(output)
    	$outputPath = $caminhoVideoConvertido . $videoName; 
    
      	// Caminho da imagem do usuário
         $profileImagePath = $caminhoFotoUsuario . $fotoPerfil; 
        	

	//Chama a função contendo os parâmetros: caminho do Vídeo, caminho da saida, o caminho da imagem e o nome de usuário 
	addWatermark($videoPath, $outputPath, $profileImagePath, $username);

    	echo "Marca d'agua adicionado com sucesso!";
	} catch (Exception $e) {
	  echo "Error: " . $e->getMessage();
	}

 endwhile;   
?>

 

Basicamente é isso...  lembrando que isso é apenas um mero exemplo,  não copie e cole este código, pois tem muitas chances de não funcionar..  Use apenas como um norte para você entender o processo e implementar no seu código.   Todas a informações relevantes já foram dadas, mas você deve, genuinamente estudar estes códigos e entende-los.  

Por isso, aconselho imensamente a não copiar este código, use só como referência para saber mais ou menos como começar a implementar.

 

Basicamente tudo que eu mostrei aqui foi feito em localhost com caminhos  fixos na máquina, no seu caso, é só substituir os caminhos fixos, pelos caminhos relativos do servidor,  montar o path de acordo com seu servidor, e de acordo com as consultas feitas no banco de dados.

 

Para enriquecer o estudo.   Você pode fazer um arquivo de teste para buscar os dados que você quer para incluir no arquivo certo.. por exemplo 2(teste de dados):

<?php

include 'conexao.php';

$id = '1';

$sql = "SELECT usuario.nomeUsuario, 
		usuario.fotoPerfil
            FROM usuario 
            WHERE usuario.ID = $id";


$consulta = mysqli_query($conexao, $sql);

$dados = mysqli_fetch_object($consulta);
$username  = $dados->nomeUsuario;
$fotoPerfil = $dados->fotoPerfil;

echo "Usuário: $username <br/>
      Foto: $fotoPerfil <br/><br/>
      Videos Deste usuário: <br/>";


$sqlVideos = "SELECT videos.Vídeo 
              FROM videos 
              INNER JOIN usuario ON usuario.ID = videos.IDusuario 
              WHERE usuario.ID = $id";

$caminho = "upload/";

$consultaVideos = mysqli_query($conexao, $sqlVideos);
 while($dados2 = mysqli_fetch_object($consultaVideos)):
    $Vídeo = $dados2->Vídeo; 
    echo $caminho . $Vídeo ."<br/>";
 endwhile;

 

Este script  só pega os dados do usuário e lista o nome, a foto de perfil  e os vídeos deste usuário... Note que eu definir manualmente o valor ID do usuário, mas você vai fazer isso dinamicamente usando a session. 

 

O resultado foi este do código acima:

spacer.png

 

Repare no código que tem uma variável $caminho 

Esta variável será responsável por conter o nome da pasta dentro do seu servidor, onde o vídeo será enviado ao fazer o upload pelo usuário..

Então no código, você vai pegar a variável caminho e concatenar com a variável com o nome do arquivo de Vídeo salvo no banco de dados.. desta forma você obtém o endereço do arquivo no seu servidor.. e então inserir no arquivo que chama a função da marca D'agua...

 

 

Conseguindo pegar os dados do usuário do banco de dados, fica fácil montar o código para gerar  a marca d'agua.

 

Veja que ali tem duas consultas, uma para pegar o nome do usuário e a foto... e outra para pegar os vídeos..  

Entenda, que no caso dos vídeos,  o bloco todo foi posto dentro do while, porque o usuário poderá ter mais de 1 vídeo... ou seja.. se ele tiver 4 videos, o sistema vai listar todos os videos dele.  e então, ele poderá escolher qual Vídeo converter.   E no caso, se ele escolher mais de 1 vídeo, como o bloco que chama a função watermark, está dentro do while, ele vai chamar a função para a quantidade de arquivos...  (código do exemplo 1)

 

Aí como você vai fazer para o usuário escolher qual arquivo converter... aí fica a seu critério...  criar um botão para cada Vídeo,  usar um multiple select para converter todos... usar radio button, para selecionar o Vídeo especifico.. enfim.. não é o foco aqui ensinar como escolher o arquivo... o foco é ensinar como pegar os dados do banco de dados  e aplicar no código da marca d'gua...   agora cabe a você estudar isso tudo e conseguir implementar. 

 

Postado
Em 13/07/2024 às 02:45, DiF disse:

agora cabe a você estudar isso tudo e conseguir implementar. 

eu quero que baixe o Vídeo especifico da variavel $videourl pois la esta o caminho do Vídeo,$userprofilepicture e $username

 

quando eu clicar ali no botao com a seta para baixo(download) para baixar o Vídeo com a foto de perfil do usuario e o nome do perfil do usuario que enviou o Vídeo,ele ira pegar a url dali de cima,pois é o caminho do Vídeo e baixar com a marca d'agua 

 

image.thumb.png.488ecdf7529be892d9d20ea07b86cfc7.png

 

  • Haha 1
  • Moderador
Postado

@Carlos FW Informatica Parece que você não entendeu a explicação, e nem estudou php.  

 

Se eu entendi bem o problema,  o usuário deveria baixar o vídeo já convertido, contendo o nome a imagem dentro do Vídeo.

Você vai usar o código acima, onde  por exemplo vai ter um formulário com o campo file.. para o usuário escolher o vídeo.. então ele envia ao servidor.. então no código, ele já pega a foto e o nome do usuário cadastrado, e converte o Vídeo contendo o nome e a imagem, como no exemplo que eu postei.

 

Então depois você  gera o link do vídeo convertido para download, dinamicamente diretamente no php.

 

exemplo:

<?php

  .....
    
    try {
      	//Mesclei o nome do usuário, com a data e também uma id única 
      	$videoName = $username.'_' . date('m-d-Y_hia').'_' . uniqid() . '.mp4';
      
      	// Caminho do Vídeo a ser convertido(input) 
    	$videoPath = $caminho . $Vídeo; 
      
      	// Caminho para onde o Vídeo convertido será salvo(output)
    	$outputPath = $caminhoVideoConvertido . $videoName; 
    
      	// Caminho da imagem do usuário
         $profileImagePath = $caminhoFotoUsuario . $fotoPerfil; 
        	

	//Chama a função contendo os parâmetros: caminho do Vídeo, caminho da saida, o caminho da imagem e o nome de usuário 
	addWatermark($videoPath, $outputPath, $profileImagePath, $username);

    	echo "Marca d'agua adicionado com sucesso!";
        echo "<a href='$outputPath' target='_blank'>Download</a>";
	} catch (Exception $e) {
	  echo "Error: " . $e->getMessage();
	}


   ...
     
  
  
    
  

 

Como você pode ver, ali no código abaixo da função,  tem uma criação de link, onde a variável $outputPath  é o endereço do vídeo, na qual o usuário vai baixar.

 

Eu recomendo que você  estude o php desde o inicio, do básico, para entender como funciona.  Já demos o norte. 

  • Curtir 1
  • Moderador
Postado

@Carlos FW Informatica Você pode tirar a data.  eu só adicionei porque é mais um elemento para diferenciar.  Só tenha certeza que nunca terá o mesmo nome de arquivo.

O único propósito da data + uniqid  é para garantir que o arquivo terá um nome único.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!