1

I'm using Primefaces <p:video> to stream a video. On Firefox everything seems OK, the video loads correctly and I can skip through the video as expected. On Chromium, though, I cannot skip through the video (tried Chrome and Edge).

Servlet:

@ApplicationScoped
@ManagedBean(name="mediaResources")
public class MediaResources extends Resources {

    public StreamedContent getMedia() {
        try {
            InputStream st = Thread.currentThread().getContextClassLoader().getResourceAsStream("video/target5_part_1_libmp3lame_libx265.mp4");
            byte[] targetArray = IOUtils.toByteArray(st);
            return DefaultStreamedContent.builder()
                    .contentType(VideoType.MP4.getMediaType())
                    .stream(() -> new ByteArrayInputStream(targetArray))
                    .build();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

Page:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui">

    <h:body>
        <p:video value="#{mediaResources.media}" player="mp4" controls="true" width="800px" />
    </h:body>
</html>

When page loads in Chromium, but not in Firefox, I get the following exception:

java.io.IOException: Error in streaming dynamic resource
    at org.primefaces.application.resource.StreamedContentHandler.handle(StreamedContentHandler.java:131)
    at org.primefaces.application.resource.PrimeResourceHandler.handleResourceRequest(PrimeResourceHandler.java:98)
    at org.richfaces.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:655)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at dk.ctu.taparga.filters.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:24)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1139)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:825)
Caused by: org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:410)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:442)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:435)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:423)
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91)
    at org.primefaces.application.resource.StreamedContentHandler.stream(StreamedContentHandler.java:160)
    at org.primefaces.application.resource.StreamedContentHandler.handle(StreamedContentHandler.java:110)
    ... 26 more
Caused by: java.net.SocketException: Connection reset by peer: socket write error
    at java.base/java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110)
    at java.base/java.net.SocketOutputStream.write(SocketOutputStream.java:150)
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:216)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:442)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
    at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:239)
    at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:119)
    at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192)
    at org.apache.coyote.Response.doWrite(Response.java:495)
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:405)
    ... 33 more

What to do to make my stream work in all browsers? Is it a limitation on which media types can be streamed in the Chromium engine?

Running Primefaces 11 and Java 8

Janus Engstrøm
  • 103
  • 1
  • 12
  • Honestly this looks like a Tomcat issue hanging up the connection with ` java.net.SocketException: Connection reset by peer: socket write error` so something different about Chrome and Firefox making the request that Tomcat doesn't like. – Melloware Sep 26 '22 at 21:27
  • @Melloware, agree. I discovered that the exception is thrown 15 seconds after page is loaded using Chromium. No exceptions are thrown when I (to no avail) try to skip through the video. I have tried on both Tomcat 7 and 8.5. Also tried the webm container format, same result. – Janus Engstrøm Sep 29 '22 at 12:51

0 Answers0