Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
    Nitan Alexandru Marcel
    @nitanmarcel
    nice, thanks
    got a weird error when I'm using it from a file name
        _input = av.open(SOURCE, metadata_errors="ignore")
        for frame in _input.decode():
            fifo.write(frame)
    gives Invalid data found when processing input; last error log: [mp3float] Header missing
    quantotto
    @quantotto
    File format might be not supported by AV. Is it MP3? Try checking if it is identified correctly by ffmpeg: ffprobe <filename>
    Nitan Alexandru Marcel
    @nitanmarcel
    it is
    Nitan Alexandru Marcel
    @nitanmarcel
    Another error now: Input frame pts 487305 != expected 0; fix or set to None.
    but this in resampler
    quantotto
    @quantotto
    @nitanmarcel sometimes decoders have issues in the middle of the stream. Some are safe to ignore, some not. Try to run some re-encoding through command line with ffmpeg. I bet it will have those errors too. I don't think it has anything to do with PyAV library.
    Nitan Alexandru Marcel
    @nitanmarcel
    @quantotto The commandline worked: ffmpeg -i input.mp3 -f s16le -acodec pcm_s16le output.raw
    Nitan Alexandru Marcel
    @nitanmarcel
    oh I fixed it by setting pts to None
    Nitan Alexandru Marcel
    @nitanmarcel
    Could anyone point me to the part in the ffmpeg code where it handles the command line input? Thanks.
    marcelnitan
    @marcelnitan:envs.net
    [m]
    Nice, I can use matrix instead of the bad gitter app
    Zeyu Dong
    @dong-zeyu

    @dong-zeyu yes, you have to calculate pts / dts yourself. Something like below worked for me:

    import av
    avin = av.open("test.264", "r", "h264")
    avout = av.open("test.mp4", "w", format="mp4")
    avout.add_stream(template=avin.streams[0])
    time_base = int(1 / avin.streams[0].time_base)
    rate = avin.streams[0].base_rate
    ts_inc = int(time_base / rate)
    ts = 0
    for pkt in avin.demux():
        pkt.pts = ts
        pkt.dts = ts
        avout.mux(pkt)
        ts += ts_inc
    avin.close()
    avout.close()

    That works! Thank you!

    1 reply
    NewUserHa
    @NewUserHa
    isn't pts increase as 1? I see testsrc=fps=30 output pts as 1,2,3,4,....
    quantotto
    @quantotto
    @NewUserHa PTS increases in time_base units. For example, if time_base for the video is 1/1000, then 1 unit of pts is actually a millisecond. Time base is something arbitrary that video creator (or software creating the video) chooses and then other timestamps (like pts, dts) align. Going with example of 1/1000 as timebase, if a video has 2 FPS frame rate, each packet / frame will have a step of half second, which is 500 in terms of pts / dts increases.
    NewUserHa
    @NewUserHa
    testsrc=fps=30 in filter graph output pts as 1,2,3,4,.... I guess if it's because of this testsrc..
    tested via pypy. still has that latency issue.
    oczkoisse
    @oczkoisse

    Hi everyone, I could use some help regarding trimming the padding from a video's frames. I've created an issue here with more details: PyAV-Org/PyAV#802. But basically, if I reshape numpy array of a frame's plane along line size and then slice along frame width to get a frame without padding, I'm not getting a properly aligned frame. However, when I try accounting for memory alignment, results are better which leads me to suspect it might be something to do with PyAv ignoring memory alignment issues in its frame width property.

    def _remove_padding(self, plane):
        """Remove padding from a video plane.
    
        Args:
            plane (av.video.plane.VideoPlane): the plane to remove padding from
    
        Returns:
            numpy.array: an array with proper memory aligned width
        """
        buf_width = plane.line_size
        bytes_per_pixel = 1
        frame_width = plane.width * bytes_per_pixel
        arr = np.frombuffer(plane, np.uint8)
        if buf_width != frame_width:
            align_to = 16
            # Frame width that is aligned up with a 16 bit boundary
            frame_width = (frame_width + align_to - 1) & ~(align_to - 1)
            # Slice (create a view) at the aligned boundary
            arr = arr.reshape(-1, buf_width)[:, :frame_width]
        return arr.reshape(-1, frame_width)

    Although the above manual alignment kind of works, it's not correct for every format. In my case, the above works correctly for luma plane but not chroma planes. I'm not sure how to proceed so any advice would be really helpful. Thanks.

    oczkoisse
    @oczkoisse
        # Frame width that is aligned up with a 16 bit boundary
    Correction: it's supposed to be 16 pixel boundary
    Kevin Lin
    @kevinlinxc
    hey guys, when I write a frame using output.mux it squishes it vertically
    output = av.open(output_name, 'w')
    stream = output.add_stream('h264', fps)
    ... #later in a loop
    frame = av.VideoFrame.from_ndarray(frame, format='bgr24')
    print(frame)
    packet = stream.encode(frame)
    output.mux(packet)
    the printout says its the right size <av.VideoFrame #0, pts=None bgr24 1080x2400 at 0x7fc15a027868>
    so I think its something wrong with stream.encode or output.mux lines?
    Kevin Lin
    @kevinlinxc
    ah i needed to set stream.height and stream.width
    Roj Serbest
    @rojserbest
    Hi, can someone help me redoing a specific Ffmpeg command with PyAV?
    1 reply
    @nitanmarcel said people might be able to help here
    quantotto
    @quantotto
    @rojserbest let's try
    Yunkai
    @lyksdu
    does pyav have new commits after Jan 2021?
    mhtrinh
    @mhtrinh
    I am trying to record my microphone with PyAV. the ffmpeg command is ffmpeg -f pulse -i 4 out.wav . What would be the equivalent in pyav ?
    1 reply
    jackiexiao
    @Jackiexiao

    hi, does anyone know how to change audio stream frame size ?

    import av
    container = av.open('8k.wav')
    for frame in container.decode(audio=0):
        print(frame.samples)

    I get 2048(256ms), but I want to get 160 (20ms) sample, how can I change it?

    dcordb
    @dcordb:matrix.org
    [m]
    Hello everyone
    How can I pass the -protocol_whitelist flag to PyAV
    I want to get the frames of an RTP stream, of which I have the SDP file.
    In ffmpeg to do this I have to pass -whitelist_protocol with rtp, udp,file if not it fails. How to do this in PyAV?
    Marcel Alexandru Nitan
    @marcelnitan:envs.net
    [m]
    How do you send Http Headers with .open?
    Or it isn't possible?
    quantotto
    @quantotto
    @dcordb you can use options argument of av.open
    dcordb
    @dcordb:matrix.org
    [m]
    But do I pass this literally? Like: av.open('foo', options=['-protocol_whitelist rtp,udp,file'])
    In general, can all ffmpeg options be passed to option keyword argument literally?
    quantotto
    @quantotto
    Options expects a dict
    Keys are parameter names (without -) and values are parameters' values. { "protocol_whitelist": "rdp,udp,file" }
    You can pass anything in options that you would pass to ffmpeg command line
    dcordb
    @dcordb:matrix.org
    [m]
    Thank you!
    Il'ya
    @MarshalX
    Hello everyone. Am I missing something? PyAV-Org/PyAV#809
    quantotto
    @quantotto
    @MarshalX worked fine for me on Ubuntu 20.04.2 with the same PyAV and ffmpeg. Worth running under gdb and seeing if it gives you more info in terms of backtrace of this crash.
    fli
    @fli:bakka.io
    [m]
    Python 3.9.5 (default, May  4 2021, 03:33:11)
    [Clang 12.0.0 (clang-1200.0.32.29)] on darwin
    
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import av
    >>> c = av.open(':0', mode='r', format='avfoundation')
    >>> c.non_block
    False
    >>> stream = c.streams[0]
    >>> stream
    <av.AudioStream #0 pcm_f32le at 44100Hz, stereo, flt at 0x10b5195e0>
    >>> for packet in c.demux(stream):
    ...     print(packet)
    ...
    <av.Packet of #0, dts=5346293809909, pts=5346293809909; 4096 bytes at 0x10b320220>
    <av.Packet of #0, dts=5346324390590, pts=5346324390590; 4096 bytes at 0x10b320360>
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "av/container/input.pyx", line 142, in demux
      File "av/container/core.pyx", line 258, in av.container.core.Container.err_check
      File "av/error.pyx", line 336, in av.error.err_check
    av.error.BlockingIOError: [Errno 35] Resource temporarily unavailable: ':0'
    Anyone know how to get avfoundation to run in blocking mode, or how to poll for packets on an audiostream? If I catch BlockingIOError it "works", but it will eat all the cpu
    sunset2017
    @sunset2017
    Hello ~ is it possible to encode frame to a Packet and then decode the frame from it immediately after? I'm trying to change the codec for the original frame from hevc to mpeg4. When I try decode the just-encoded Packet, by using decode_context.decode(new_packets[0]), the error says Operation not permitted;. Is it because the Packet is generated from encoding operation? or there is something wrong with the decode context set up
    Blake VandeMerwe
    @blakev

    I'm trying to set the metadata fields on an MPEG-TS clip. I can set service_type using the container_options but can't figure out how to set the metadata since there's a space for the field name and there's two of them (python dictionary)

    example from ffmpeg docs,

    ffmpeg -i file.mpg -c copy \
         -mpegts_original_network_id 0x1122 \
         -mpegts_transport_stream_id 0x3344 \
         -mpegts_service_id 0x5566 \
         -mpegts_pmt_start_pid 0x1500 \
         -mpegts_start_pid 0x150 \
         -metadata service_provider="Some provider" \   <--- these
         -metadata service_name="Some Channel" \
         out.ts

    code,

            out = av.open(
                out_name,
                'w',
                format='mpegts',
                container_options={
                    'mpegts_copyts': '1',
                    'mpegts_service_type': 'mpeg2_digital_hdtv',
                },
            )
            out.flags |= 'DISCARD_CORRUPT'
    fatshotty
    @fatshotty
    hi, anyone here?
    2 replies