Newest 'ffmpeg' Questions - Stack Overflow

http://stackoverflow.com/questions/tagged/ffmpeg

Les articles publiés sur le site

  • Download HLS ( HTTP ) Stream video using python

    21 juin, par LeDerp

    I need to download a streaming video(from a URL) using python the command line argument would be:

    ffmpeg -i URL stream.mp4
    

    I know I can use the subprocess command

    subprocess.call('ffmpeg -i '+ URL +' stream.mp4', shell=True)
    

    Is there any alternative like a API that I can use instead of using subprocess command

  • How to crop video with same aspect ratio such as DAR ? [closed]

    21 juin, par showkey

    Some arguments in sample.mp4:

    ffprobe -i  sample.mp4  2>&1 | grep DAR
    Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], 310 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    

    In the sample.mp4,width is 1280,height is 720,SAR=1:1=1,so we get the DAR value:

    DAR = (width/height)*SAR = (1280/720) * 1 = (16*80)/(9*80) = 16:9
    

    I want to crop sample.mp4 into width:496 and height:279, 496/279 = (31*16)/(31*9) = 16:9.

    ffmpeg -i sample.mp4 -vf "crop=496:279:0:0" output.mp4
    

    Show DAR value in output.mp4:

    ffprobe -i  output.mp4 2>&1 | grep DAR
    Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 496x278 [SAR 1:1 DAR 248:139], 81 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    

    How can crop the video sample.mp4 into new video with width:496 and height:279 and DAR 16:9?

  • Facebook Reels Upload always failing

    21 juin, par Evrard A.

    I'm trying to upload Reels through Facebook Graph API. The video is created with the following ffmpeg command.

    cmd = [
                'ffmpeg',
                '-i', video_path,
                '-i', voice_path,
                '-i', music_path,
    
                '-filter_complex',
                '[1:a]loudnorm=I=-16:LRA=11:TP=-1.5,adelay=0|0[a1];' +
                '[2:a]volume=0.2,afade=t=in:ss=0:d=0.02,afade=t=out:st=28:d=0.03[a2];' +
                '[a1][a2]amix=inputs=2:duration=first:dropout_transition=0[aout]',
    
                '-map', '0:v:0',
                '-map', '[aout]',
    
                '-vf',
                 f"subtitles='{str(ass_path)}',format=yuv420p,scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1",  # Incrustation des sous-titres
    
                '-r', '30',
                '-g', '60',
                '-keyint_min', '60',
                '-sc_threshold', '0',
                '-x264opts', 'no-scenecut',
    
                '-c:v', 'libx264',
                '-profile:v', 'baseline',
                '-level', '4.1',
                '-pix_fmt', 'yuv420p',
                '-color_range', 'tv',
                '-colorspace', 'bt709',
    
                '-b:v', '9500k',
                '-maxrate', '9500k',
                '-bufsize', '19000k',
    
                '-c:a', 'aac',
                '-b:a', '192k',
                '-ac', '2',
                '-ar', '48000',
    
                '-movflags', '+faststart',
                '-video_track_timescale', '15360',
                '-max_muxing_queue_size', '9999',
    
                '-y', self.output_video_path if self.output_video_path else f'{parts[0]}.subtitled.{parts[1]}'
            ]
    
            subprocess.run(cmd, check=True)
    

    Here is the class method I use to publish:

      import requests, os,  time
      from datetime import datetime, timedelta
      from moviepy.editor import VideoFileClip
       
      def post_reel(
          self,
          page_id: str,
          page_access_token: str,
          video_file_path: str,
          video_description: str,
          tags: list = None, # type: ignore
          publish_now: bool = True
      ):
          def extract_first_frame(video_path: str, output_image_path: str, time_in_seconds: float = 1):
              """
              Extrait une frame à time_in_seconds et la sauvegarde comme miniature.
              """
              try:
                  clip = VideoFileClip(video_path)
                  clip.save_frame(output_image_path, t=time_in_seconds)
                  print(f"[THUMBNAIL] Frame at {time_in_seconds}s saved to {output_image_path}")
                  return output_image_path
              except Exception as e:
                  print(f"[ERROR] Could not extract thumbnail: {str(e)}")
                  return None
    
          def wait_for_video_ready(video_id, page_access_token, timeout=300, poll_interval=10):
              """
              Attends que la vidéo soit complètement traitée et publiée.
              """
              status_url = f"{self.BASE_API_URL}/{video_id}"
              params = {
                  "access_token": page_access_token,
                  "fields": "status"
              }
    
              start = time.time()
              while time.time() - start < timeout:
                  try:
                      r = requests.get(url=status_url, params=params)
                      r.raise_for_status()
                      status = r.json().get("status", {})
                      processing = status.get("processing_phase", {}).get("status")
                      publishing = status.get("publishing_phase", {}).get("status")
                      video_status = status.get("video_status")
    
                      print(f"[WAIT] video_status={video_status}, processing={processing}, publishing={publishing}")
    
                      if processing == "complete" and publishing == "complete":
                          print("[READY] Reel processed and published")
                          return True
                      elif processing == "error":
                         print(r.json())
    
                  except Exception as e:
                      print(f"[ERROR] during polling: {e}")
    
                  time.sleep(poll_interval)
    
              print("[TIMEOUT] Video did not finish processing in time.")
              return False
    
          try:
              # Step 1: Initialize upload
              init_url = f"{self.BASE_API_URL}/{page_id}/video_reels"
              init_params = {"upload_phase": "start"}
              init_payload = {'access_token': page_access_token}
    
              r = requests.post(url=init_url, data=init_payload, params=init_params)
              r.raise_for_status()
              response = r.json()
              video_id = response["video_id"]
              upload_url = response["upload_url"]
              print(f"[INIT OK] Video ID: {video_id}")
    
              # Step 2: Upload video
              file_size = os.path.getsize(video_file_path)
              headers = {
                  'Authorization': f"OAuth {page_access_token}",
                  'offset': "0",
                  'file_size': str(file_size),
              }
    
              with open(video_file_path, 'rb') as f:
                  files = {'source': f}
                  r = requests.post(url=upload_url, data=files, headers=headers)
                  r.raise_for_status()
                  upload_response = r.json()
    
              if not upload_response.get("success"):
                  print("[ERROR] Upload failed.")
                  return None
              print(f"[UPLOAD OK]")
    
              # Step 3: Check video status
              status_check_url = f'{self.BASE_API_URL}/{video_id}'
              check_params = {
                  "access_token": page_access_token,
                  "fields": "status"
              }
              r = requests.get(url=status_check_url, params=check_params)
              r.raise_for_status()
              print(f"[STATUS CHECK] {r.json()}")
    
              # Step 4: Finalize video
              finalize_params = {
                  "video_id": video_id,
                  "upload_phase": "finish",
                  "published": "true",
                  "access_token": page_access_token,
                  "video_state": "PUBLISHED" if publish_now else "SCHEDULED",
                  "title": video_description,
                  "description": video_description
              }
    
              if not publish_now:
                  finalize_params["scheduled_publish_time"] = int((datetime.now() + timedelta(days=1)).timestamp())
    
              if tags:
                  finalize_params["tags"] = ",".join(tags)
    
              r = requests.post(url=init_url, params=finalize_params, headers=headers)
              r.raise_for_status()
              finalize_response = r.json()
              post_id = finalize_response.get("post_id")
              print(f"[FINALIZE OK] Post ID: {post_id}")
              
              # WAIT UNTIL PUBLISHED
              if not wait_for_video_ready(video_id, page_access_token):
                  print("[ERROR] Reel processing timeout or failure")
                  return None
              
              # Step 5: Extract and upload thumbnail
              thumbnail_path = f"temp_thumb_{video_id}.jpg"
              if extract_first_frame(video_file_path, thumbnail_path):
                  thumb_url = f"{self.BASE_API_URL}/{video_id}/thumbnails"
                  with open(thumbnail_path, 'rb') as img:
                      files = {'source': img}
                      thumb_payload = {'access_token': page_access_token}
                      r = requests.post(url=thumb_url, files=files, data=thumb_payload)
                      r.raise_for_status()
                      print("[THUMBNAIL UPLOADED]")
                  # Clean up temp file
                  os.remove(thumbnail_path)
                  print("[THUMBNAIL CLEANED UP]")
    
              return post_id
    
          except Exception as e:
              print(f"[ERROR] {str(e)}")
              return None
    

    Here are the logs I get :

    • [INIT OK] Video ID: 1020853163558419
    • [UPLOAD OK]
    • [STATUS CHECK]
    {
      "status": {
        "video_status": "upload_complete",
        "uploading_phase": {
          "status": "complete",
          "bytes_transferred": 37780189
        },
        "processing_phase": {
          "status": "not_started"
        },
        "publishing_phase": {
          "status": "not_started"
        },
        "copyright_check_status": {
          "status": "in_progress"
        }
      },
      "id": "1020853163558419"
    }
    
    • [FINALIZE OK] Post ID: 122162302376476425
    • [WAIT] video_status=upload_complete, processing=not_started, publishing=not_started
    • [WAIT] video_status=error, processing=error, publishing=not_started
    {
      "status": {
        "video_status": "error",
        "uploading_phase": {
          "status": "complete",
          "bytes_transferred": 37780189
        },
        "processing_phase": {
          "status": "error",
          "errors": [
            {
              "code": 1363008,
              "message": "Video Creation failed, please try again."
            }
          ]
        },
        "publishing_phase": {
          "status": "not_started"
        },
        "copyright_check_status": {
          "status": "in_progress"
        }
      },
      "id": "1020853163558419"
    }
    

    It seems the error code 1363008 is related to the video properties format but even after following Facebook Reels video format recommandations, I can't make it work.

    Can you help me with this please ?

    I failed getting usefull help with ChatGPT 😅, and thanks in advance for anyone who answers or comments my question.

  • How to convert cmd pipe to powershell in context of binary data (ffmpeg and streamlink)

    20 juin, par Filip Krawczyk

    I'd like to convert a pipe of video stream between streamlink and ffmpeg from cmd to Powershell. But from what I searched powershell only supports piping objects.

    Is there any way to reproduce this in Powershell without using Start-Process -FilePath "cmd" -ArgumentList [...]? I'd prefer not to use it because I need access to the exit code.

    streamlink $stream_url best -O | ffmpeg -i pipe: "output_file.mp4"
    

    note: the line above had some args removed for better clarity

  • "Could not find com.arthenica:ffmpeg-kit-https:6.0-2" after ffmpeg_kit_flutter deprecation

    20 juin, par Tarun Hasija

    I am at latest flutter 3.32.4

    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':ffmpeg_kit_flutter:compileDebugJavaWithJavac'.
    > Could not resolve all files for configuration ':ffmpeg_kit_flutter:debugCompileClasspath'.
       > Could not find com.arthenica:ffmpeg-kit-https:6.0-2.
         Required by:
             project :ffmpeg_kit_flutter
    
    * Try:
    > Run with --stacktrace option to get the stack trace.
    > Run with --info or --debug option to get more log output.
    > Run with --scan to get full insights.
    > Get more help at https://help.gradle.org.
    
    BUILD FAILED in 25s
    Error: Gradle task assembleStagingDebug failed with exit code 1