Problema ao reproduzir vídeos no Safari do iOS e macOS

Olá a todos,

Estamos vendo um problema na 3.6.0.beta3-latest onde usuários de iPhone e Safari no macOS recebem um spinner infinito ao tentar reproduzir um vídeo .mp4 (H.264) enviado. Esses mesmos vídeos funcionavam bem até recentemente (não tenho certeza qual foi a última versão do Discourse em que eles funcionaram).

Parece que o Safari faz um GET para buscar os primeiros bytes (Range: bytes=0-1) do vídeo (ex: /uploads/default/original/1X/44395933ccadf546b1b1ce65b742e24f900b33fa.mp4), que retorna 200, mas falha por motivos que não são mostrados no console JS ou no inspetor de rede (apenas destacados em vermelho, sem mensagens de erro). Se o mesmo URL for colado diretamente no navegador, eles conseguem baixar o vídeo completo e reproduzi-lo com sucesso.

Firefox e Chrome no macOS não têm problemas para reproduzir os vídeos. Navegadores no Android também não parecem ter problemas.

Os vídeos são pequenos (na faixa de 10MB). Não estamos usando S3 para uploads.

Alguém mais pode corroborar, ou confirmar que não está tendo problemas com iPhones/Safari reproduzindo vídeos? E há algum outro diagnóstico que eu possa fazer que possa lançar luz sobre o problema?

1 curtida

Estou enfrentando um problema semelhante com meu fórum, mas testar os mesmos arquivos aqui parece funcionar bem. Apenas usuários de iOS/Safari são afetados. Alguns vídeos no contêiner WEBM funcionam, mas a maioria dos mp4, mov, etc., não.

2 curtidas

Olá, tenho visto problemas recentemente e comentei em um tópico iniciado por @tsk que foi deslistado. Eu estava trabalhando sob a suposição de que o problema era com vídeos codificados em mp4/av1, pois vídeos webm/vp9 estavam sendo reproduzidos em nosso fórum, mas parece que o problema é mais do que isso para usuários do Safari.

Só para rir, verifiquei se estou na versão mais recente, embora não tenha visto nada nos commits que indicasse que isso afeta os usuários da Apple.

image

Minha configuração está usando armazenamento local para uploads. A maioria dos tópicos está bloqueada por nível de confiança, mas estamos testando em uma categoria pública aqui:

Você pode compartilhar um link para o vídeo em questão ou enviá-lo aqui?

1 curtida

@Les79 Carreguei este vídeo em ambos os fóruns como um teste.

Você pode confirmar que o vídeo no tópico de reprodução do pixelspace safari não funciona para você, mas o vídeo aqui funciona?

1 curtida

Sim, o vídeo postado aqui funciona no Safari tanto no meu iPhone 13 quanto no MacBook Pro M3. Ele não funciona no fórum PixelSpace.

2 curtidas

Este vídeo é H.264 em MP4, ele deve rodar em todos os navegadores que executam o Discourse. Dado que ele roda aqui e não na sua instância, suspeito que algo esteja mal configurado lá.

Você executa algum proxy reverso adicional sobre o Discourse? Eu vi alguns cabeçalhos nesta instância que não existem em instalações padrão, então estou curioso sobre o que foi feito lá.

1 curtida

Estou vendo o mesmo.

Eu uso este contêiner como um proxy reverso

Eu considerei que isso poderia ser parcialmente responsável, mas a configuração não mudou e este é um novo problema a partir da versão 3.6.0-beta2, pelo que pude apurar. Comecei a receber reclamações de usuários da Apple após a reconstrução. Semelhante a @mandyk, eu não me lembro em qual versão estávamos anteriormente.

image

Existe alguma configuração específica no Discourse que eu deva avaliar?

1 curtida

Não é o Discourse, mas o proxy.

Infelizmente, não podemos cobrir realisticamente todas as infinitas possibilidades de configurações quando as pessoas adicionam coisas sobre o Discourse, e é por isso que enviamos com uma configuração conhecida e boa na instalação padrão que vem com um proxy reverso configurado para o Discourse.

Pode faltar uma única diretiva de configuração do nginx, mas você precisará pesquisar sobre isso.

1 curtida

Também confirmo que o vídeo postado neste tópico funciona bem no Safari.

Não tenho certeza se isso é relevante, mas uma diferença que consigo notar é que o vídeo neste tópico está sendo servido do S3. Quando o Safari faz a primeira solicitação de intervalo, o S3 responde com HTTP 206, o que parece correto. Tanto a instância do Pixelspace quanto a minha instância não estão usando S3, e parece que o Discourse está respondendo com HTTP 200 (o que não parece correto, porque a solicitação inclui um cabeçalho Range: bytes=0-1).

Fiz o upload do mesmo vídeo para minha instância de teste em
https://discourse-on-a-pi5.falco.dev/t/test-safari-bug/25?u=falco

Confirmado que o vídeo em discourse-on-a-pi5.falco.dev não está funcionando para mim no Safari. Novamente, posso ver que a solicitação de vídeo está retornando 200 em vez de 206.

Editar: Além disso, parece que a resposta está tentando retornar o vídeo inteiro, embora Range: bytes=0-1 tenha sido especificado. Suspeito que as solicitações de intervalo estão sendo ignoradas, e o Safari parece ser sensível a isso.

Editar adicional: Isso provavelmente significa que a busca eficiente em vídeos maiores está quebrada para navegadores além do Safari também, pois eles precisam baixar o vídeo inteiro antes de poderem buscar.

3 curtidas

Reprodução não funciona no Safari para mim

E funciona em Test Safari Bug - Discourse, certo?

Sim, esse funciona! E vejo HTTP 206 ali.

1 curtida

Parece uma regressão na nossa configuração padrão do nginx então, obrigado pelo relato @mandyk

1 curtida

Obrigado a @Adubs por postar uma contra-reprodução para comparar! E à equipe do Discourse por uma ferramenta brilhante.

5 curtidas

Então, só para dar mais risadas, copiei meu app.yml para app2.yml, mudei a URL e alguns diretórios, e agora temos o testfor.pixelspace.xyz rodando a branch estável.

https://testfor.pixelspace.xyz/t/safari-playback-test/8

Meus usuários confirmam que funciona aqui através do mesmo proxy.

edit: Agora vejo que há confirmação do problema. Peço desculpas por não ter pensado em tentar isso antes. Obrigado pela sua visão @mandyk

Eu não teria descoberto isso sozinho.

3 curtidas