Opencv error: Unknown error code -10 (Raw image encoder error: Empty JPEG not supported (DNL not supported)

When I execute this code I get the error as specified above.

import sys
import cv2
import pickle
import numpy as np
import struct ## new
#import zlib
import os


HOST=''
PORT=5500

# create a socket object
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Socket created")




# bind to the port
serversocket.bind((HOST,PORT))
print("Socket bind complete")

# queue up to 5 requests
serversocket.listen(5)
print("Socket now lisening")



# establish a connection
conn,addr=serversocket.accept()
cap = cv2.VideoCapture('test.mp4')
img_counter=0
#encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),100]
while True:
    ret,frame=cap.read()
    result,frame=cv2.imencode('.jpg',frame)
    data=pickle.dumps(frame)
    size=len(data)
    print("{}:{}".format(img_counter,size))
    conn.sendall(struct.pack(">L",size)+data)
    img_counter+=1

conn.close()

welcome.

I’ve wrapped your code in backticks so it gets displayed right. a good quality post has a higher chance of getting answers.

please make it easy for others to help you. that includes removing irrelevant parts of your code.

you should use a debugger. please show that you’ve spent some appropriate effort to solve your problem on your own. show that you know what your own code does.

Thank you for your reply. It is a server program which sends the video file (test.mp4) to the client. On the client side, the video gets played but the sound couldn’t be heard. On the server side, i get the error message which i had posted earlier. I used imwrite() method to see the frames. Actually, the video test.mp4 has 132 frames. when the imencode() method is used I get 133 frames in which 133rd frame is empty. So, I feel due to the 133rd frame i am getting the error message.

Before you try to use frame you should check what you get in ret, frame and evetually exit loop when there is no more frames.

if not ret:  # eventually `if ret is False:`
    print("No more frames")
    break

or

if frame is None:  # will not work `if not frame:` because `frame` can be numpy array which may need `any()` or `all()` to check if it is True or False.
    print("No more frames")
    break

while True:
    ret, frame = cap.read()
    
    if not ret:
        print("no more frames")
        break
        
    result, frame = cv2.imencode('.jpg', frame)
    data = pickle.dumps(frame)
    size = len(data)
    print("{}:{}".format(img_counter, size))
    conn.sendall(struct.pack(">L", size) + data)
    img_counter += 1

I added spaces in some places to make it more readable.
See PEP 8 – Style Guide for Python Code

1 Like

As for sound: openCV doesn’t read sound. It was created only to work with video. Besides you convert to jpg which also can’t keep sound. It was created only to work with image.

If you want to stream video with sound then you have to use something different - ie. ffmpeg.

1 Like

Thank you for your email.

Thank you. I will try

Thank you. But, I we split the video in to frames and then assemble back to video the sound can be heard

You can’t do this with cv2 because it doesn’t work with sound - it gives only image and sound is lost.

You would use ffmpeg to split file into two files - file with video, file with audio. Next you could use cv2 to change video and create new file with video. After that you could use again ffmpeg to join audio and video into one file again. And later you may send it as normal video file - ie. .mp4 - with video and audio.

I don’t know method to send it as single frames with audio.

Thank you for your help