
Recherche avancée
Médias (1)
-
Rennes Emotion Map 2010-11
19 octobre 2011, par
Mis à jour : Juillet 2013
Langue : français
Type : Texte
Autres articles (58)
-
Websites made with MediaSPIP
2 mai 2011, parThis page lists some websites based on MediaSPIP.
-
Creating farms of unique websites
13 avril 2011, parMediaSPIP platforms can be installed as a farm, with a single "core" hosted on a dedicated server and used by multiple websites.
This allows (among other things) : implementation costs to be shared between several different projects / individuals rapid deployment of multiple unique sites creation of groups of like-minded sites, making it possible to browse media in a more controlled and selective environment than the major "open" (...) -
Les autorisations surchargées par les plugins
27 avril 2010, parMediaspip core
autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs
Sur d’autres sites (8017)
-
Youtube automatic creating and starting live stream with ffmpeg Python
20 août 2023, par MrKolia1_1I'm trying to create a new broadcast on the channel and then start the stream so that the video is broadcast, the problem is that I can't start the broadcast after it is created, it is in the scheduled, how can I start the broadcast ?




import datetime
import json
import os
import threading
import time

import cv2
import subprocess
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build

APP_TOKEN_FILE = "client_secret.json"
USER_TOKEN_FILE = "user_token.json"

SCOPES = [
 'https://www.googleapis.com/auth/youtube.force-ssl',
 'https://www.googleapis.com/auth/userinfo.profile',
]


def get_stream_info(stream_id):
 creds = get_creds_saved()
 service = build('youtube', 'v3', credentials=creds)

 request = service.liveBroadcasts().list(
 part='snippet,contentDetails,status',
 id=stream_id
 )

 response = request.execute()

 if 'items' in response and len(response['items']) > 0:
 return response['items'][0]
 else:
 return None


def get_creds_cons():
 # Create credentials via console flow
 flow = InstalledAppFlow.from_client_secrets_file(APP_TOKEN_FILE, SCOPES)
 return flow.run_console()


def get_creds_saved():
 creds = None

 if os.path.exists(USER_TOKEN_FILE):
 # Load user credentials from a saved file
 creds = Credentials.from_authorized_user_file(USER_TOKEN_FILE, SCOPES)

 if not creds or not creds.valid:
 if creds and creds.expired and creds.refresh_token:
 creds.refresh(Request())
 else:
 # Create new credentials via local server flow
 flow = InstalledAppFlow.from_client_secrets_file(APP_TOKEN_FILE, SCOPES)
 creds = flow.run_local_server(port=0)

 with open(USER_TOKEN_FILE, 'w') as token:
 token.write(creds.to_json())

 return creds


def get_service():
 # Get YouTube API service using credentials
 creds = get_creds_saved()
 service = build('youtube', 'v3', credentials=creds)
 return service


def create_live_stream(title, description):
 service = get_service()
 scheduled_start_time = datetime.datetime.utcnow().isoformat()

 request = service.liveBroadcasts().insert(
 part="snippet,status,contentDetails",
 body={
 "snippet": {
 "title": title,
 "description": description,
 "scheduledStartTime": scheduled_start_time,
 },
 "status": {
 "privacyStatus": "private",
 "lifeCycleStatus": "ready",
 "recordingStatus": "notRecording",
 "selfDeclaredMadeForKids": False
 },
 "contentDetails": {
 "enableAutoStart": False
 }
 }
 )
 response = request.execute()
 return response['id']


def stream_video(video_path, stream_key):
 args = [
 '-re',
 '-i', video_path,
 '-c:v', 'libx264',
 '-preset', 'veryfast',
 '-c:a', 'aac',
 '-f', 'flv',
 f'rtmp://a.rtmp.youtube.com/live2/{stream_key}'
 ]

 subprocess.run(['ffmpeg'] + args)


def get_scheduled_stream_info(stream_id):
 creds = get_creds_saved()
 service = build('youtube', 'v3', credentials=creds)

 request = service.liveBroadcasts().list(
 part='snippet,status',
 id=stream_id
 )

 response = request.execute()

 if 'items' in response and len(response['items']) > 0:
 return response['items'][0]
 else:
 return None



if __name__ == '__main__':
 print("** Hello, Azzrael_YT subscribers!!!\n")

 strId = create_live_stream("tittle", "description")
 pretty_json = json.dumps(get_scheduled_stream_info(strId), indent=4)

 print(pretty_json)

 # Stream video
 video_path = "C:/Users/admin/PycharmProjects/pythonProject/video.mp4" # Update this with your video file path
 stream_key = 'dh9z-jtkx-wbq3-6wvp-2tac' # Replace with your YouTube stream key
 video_thread = threading.Thread(target=stream_video, args=(video_path, stream_key))
 #video_thread.start()




json responce info from created stream :
,
"scheduledStartTime" : "2023-08-20T10:51:22Z",
"isDefaultBroadcast" : false,
"liveChatId" : "KicKGFVDZ01UNS1CLVNfV0FJencxVXY4cC1ZQRILSG9QU0RJZ2hQMkE"
,
"status" : 
"lifeCycleStatus" : "created",
"privacyStatus" : "private",
"recordingStatus" : "notRecording",
"madeForKids" : false,
"selfDeclaredMadeForKids" : false




-
FFMPEG : TS video copied to MP4, missing 3 first frames [closed]
21 août 2023, par Vasilis LemonidisRunning :


ffmpeg -i test.ts -fflags +genpts -c copy -y test.mp4



for this test.ts, which has 30 frames, readable by opencv, I end up with 28 frames, out of which 27 are readable by opencv. More specifically :


ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 tmp.ts 



returns 30.


ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 tmp.mp4



returns 28.


Using OpenCV in that manner


cap = cv2.VideoCapture(tmp_path)
readMat = []
while cap.isOpened():
 ret, frame = cap.read()
 if not ret:
 break
 readMat.append(frame)



I get for the ts file 30 frames, while for the mp4 27 frames.


Could someone explain why the discrepancies ? I get no error during the transformation from ts to mp4 :


ffmpeg version N-111746-gd53acf452f Copyright (c) 2000-2023 the FFmpeg developers
 built with gcc 11.3.0 (GCC)
 configuration: --ld=g++ --bindir=/bin --extra-libs='-lpthread -lm' --pkg-config-flags=--static --enable-static --enable-gpl --enable-libaom --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libsvtav1 --enable-libdav1d --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree --enable-cuda-nvcc --enable-cuvid --enable-nvenc --enable-libnpp 
 libavutil 58. 16.101 / 58. 16.101
 libavcodec 60. 23.100 / 60. 23.100
 libavformat 60. 10.100 / 60. 10.100
 libavdevice 60. 2.101 / 60. 2.101
 libavfilter 9. 10.100 / 9. 10.100
 libswscale 7. 3.100 / 7. 3.100
 libswresample 4. 11.100 / 4. 11.100
 libpostproc 57. 2.100 / 57. 2.100
[mpegts @ 0x4237240] DTS discontinuity in stream 0: packet 5 with DTS 306003, packet 6 with DTS 396001
Input #0, mpegts, from 'tmp.ts':
 Duration: 00:00:21.33, start: 3.400000, bitrate: 15 kb/s
 Program 1 
 Metadata:
 service_name : Service01
 service_provider: FFmpeg
 Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 300x300, 1 fps, 3 tbr, 90k tbn
Output #0, mp4, to 'test.mp4':
 Metadata:
 encoder : Lavf60.10.100
 Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 300x300, q=2-31, 1 fps, 3 tbr, 90k tbn
Stream mapping:
 Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[out#0/mp4 @ 0x423e280] video:25kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.192123%
frame= 30 fps=0.0 q=-1.0 Lsize= 26kB time=00:00:21.00 bitrate= 10.3kbits/s speed=1e+04x 



Additional information


The origin of the video I am processing comes from a continuous stitching operation of still images ts videos, produced by this class
update
method :

import cv2
import os
import subprocess
from tempfile import NamedTemporaryFile
class VideoUpdater:
 def __init__(
 self, video_path: str, framerate: int, timePerFrame: Optional[int] = None
 ):
 """
 Video updater takes in a video path, and updates it using a supplied frame, based on a given framerate.
 Args:
 video_path: str: Specify the path to the video file
 framerate: int: Set the frame rate of the video
 """
 if not video_path.endswith(".mp4"):
 LOGGER.warning(
 f"File type {os.path.splitext(video_path)[1]} not supported for streaming, switching to ts"
 )
 video_path = os.path.splitext(video_path)[0] + ".mp4"

 self._ps = None
 self.env = {
 
 }
 self.ffmpeg = "/usr/bin/ffmpeg "

 self.video_path = video_path
 self.ts_path = video_path.replace(".mp4", ".ts")
 self.tfile = None
 self.framerate = framerate
 self._video = None
 self.last_frame = None
 self.curr_frame = None


 def update(self, frame: np.ndarray):
 if len(frame.shape) == 2:
 frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
 else:
 frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
 self.writeFrame(frame)

 def writeFrame(self, frame: np.ndarray):
 """
 The writeFrame function takes a frame and writes it to the video file.
 Args:
 frame: np.ndarray: Write the frame to a temporary file
 """


 tImLFrame = NamedTemporaryFile(suffix=".png")
 tVidLFrame = NamedTemporaryFile(suffix=".ts")

 cv2.imwrite(tImLFrame.name, frame)
 ps = subprocess.Popen(
 self.ffmpeg
 + rf"-loop 1 -r {self.framerate} -i {tImLFrame.name} -t {self.framerate} -vcodec libx264 -pix_fmt yuv420p -y {tVidLFrame.name}",
 env=self.env,
 shell=True,
 stdout=subprocess.PIPE,
 stderr=subprocess.PIPE,
 )
 ps.communicate()
 if os.path.isfile(self.ts_path):
 # this does not work to watch, as timestamps are not updated
 ps = subprocess.Popen(
 self.ffmpeg
 + rf'-i "concat:{self.ts_path}|{tVidLFrame.name}" -c copy -y {self.ts_path.replace(".ts", ".bak.ts")}',
 env=self.env,
 shell=True,
 stdout=subprocess.PIPE,
 stderr=subprocess.PIPE,
 )
 ps.communicate()
 shutil.move(self.ts_path.replace(".ts", ".bak.ts"), self.ts_path)

 else:
 shutil.copyfile(tVidLFrame.name, self.ts_path)
 # fixing timestamps, we dont have to wait for this operation
 ps = subprocess.Popen(
 self.ffmpeg
 + rf"-i {self.ts_path} -fflags +genpts -c copy -y {self.video_path}",
 env=self.env,
 shell=True,
 # stdout=subprocess.PIPE,
 # stderr=subprocess.PIPE,
 )
 tImLFrame.close()
 tVidLFrame.close()



-
High pitched audio or no audio at all when converting AVI video to MP4 with FFmpeg [closed]
15 août 2023, par Karen SI'm pretty new to FFmpeg and I'm having trouble converting a video from AVI format to MP4. I'm trying to convert pcm_s16le to aac. No matter what audio stream I use, the resulting audio in the MP4 file is either very high pitched and choppy (stream 1) or the audio stream is silent (stream 2).


The AVI video has two audio streams :


Stream #0:1: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Stream #0:2: Audio: pcm_s16le, 32000 Hz, stereo, s16, 1024 kb/s



In VLC Media Player the video plays fine and it uses the second audio stream.


When I run
ffmpeg -i input.avi -vcodec libx264 -crf 27 output.mp4
in my terminal, the output audio in the MP4 file is very high pitched and choppy in VLC.
This is the codec information for the audio stream in VLC after the conversion :

Codec: MPEG AAC Audio (mp4a)
Type: Audio
Channels: Stereo
Sample rate: 48000 Hz
Bits per sample: 32



When I specify the audio stream and codec the resulting video is silent.


ffmpeg -i input.avi -map 0:v:0 -vcodec libx264 -crf 29 -map 0:a:1 -acodec aac output.mp4



This is the terminal output from FFmpeg :


FILEPATH -i "input.avi" -map 0:v:0 -vcodec libx264 -crf 29 -map 0:a:1 -acodec aac "output.mp4"
ffmpeg version 2023-06-11-git-09621fd7d9-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
 built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
 configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
 libavutil 58. 13.100 / 58. 13.100
 libavcodec 60. 17.100 / 60. 17.100
 libavformat 60. 6.100 / 60. 6.100
 libavdevice 60. 2.100 / 60. 2.100
 libavfilter 9. 8.101 / 9. 8.101
 libswscale 7. 3.100 / 7. 3.100
 libswresample 4. 11.100 / 4. 11.100
 libpostproc 57. 2.100 / 57. 2.100
[avi @ 000002533665a400] Switching to NI mode, due to poor interleaving
Input #0, avi, from 'input.avi':
 Duration: 00:10:40.64, start: 0.000000, bitrate: 28852 kb/s
 Stream #0:0: Video: dvvideo, yuv411p, 720x480 [SAR 32:27 DAR 16:9], 25000 kb/s, SAR 8:9 DAR 4:3, 60k fps, 29.97 tbr, 60k tbn
 Stream #0:1: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
 Stream #0:2: Audio: pcm_s16le, 32000 Hz, stereo, s16, 1024 kb/s
File 'output.mp4' already exists. Overwrite? [y/N] y
Stream mapping:
 Stream #0:0 -> #0:0 (dvvideo (native) -> h264 (libx264))
 Stream #0:2 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
[libx264 @ 00000253366702c0] using SAR=8/9
[libx264 @ 00000253366702c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 00000253366702c0] profile High 4:2:2, level 3.0, 4:2:2, 8-bit
[libx264 @ 00000253366702c0] 264 - core 164 r3107 a8b68eb - H.264/MPEG-4 AVC codec - Copyleft 2003-2023 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=29.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
 Metadata:
 encoder : Lavf60.6.100
 Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv422p(tv, bottom coded first (swapped)), 720x480 [SAR 8:9 DAR 4:3], q=2-31, 29.97 fps, 30k tbn
 Metadata:
 encoder : Lavc60.17.100 libx264
 Side data:
 cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
 Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 32000 Hz, stereo, fltp, 128 kb/s
 Metadata:
 encoder : Lavc60.17.100 aac
[dvvideo @ 000002533879d780] Concealing bitstream errors.41 bitrate= 901.6kbits/s speed=2.01x
 Last message repeated 76 times
[dvvideo @ 000002533878f640] Concealing bitstream errors.43 bitrate= 925.1kbits/s speed=1.97x
 Last message repeated 19 times
[out#0/mp4 @ 00000253366770c0] video:72743kB audio:119kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.649282%
frame=19200 fps= 58 q=-1.0 Lsize= 73335kB time=00:10:40.61 bitrate= 937.8kbits/s speed=1.92x
[libx264 @ 00000253366702c0] frame I:99 Avg QP:28.84 size: 35252
[libx264 @ 00000253366702c0] frame P:4922 Avg QP:31.82 size: 9208
[libx264 @ 00000253366702c0] frame B:14179 Avg QP:36.03 size: 1811
[libx264 @ 00000253366702c0] consecutive B-frames: 1.2% 0.8% 1.1% 97.0%
[libx264 @ 00000253366702c0] mb I I16..4: 13.7% 74.6% 11.7%
[libx264 @ 00000253366702c0] mb P I16..4: 1.7% 6.7% 1.1% P16..4: 38.6% 13.2% 9.3% 0.0% 0.0% skip:29.3%
[libx264 @ 00000253366702c0] mb B I16..4: 0.2% 0.5% 0.0% B16..8: 37.3% 2.8% 0.7% direct: 2.1% skip:56.3% L0:42.5% L1:52.2% BI: 5.3%
[libx264 @ 00000253366702c0] 8x8 transform intra:69.6% inter:71.7%
[libx264 @ 00000253366702c0] coded y,uvDC,uvAC intra: 65.4% 59.0% 8.7% inter: 12.9% 7.0% 0.1%
[libx264 @ 00000253366702c0] i16 v,h,dc,p: 12% 64% 7% 16%
[libx264 @ 00000253366702c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 11% 26% 26% 5% 6% 5% 8% 5% 8%
[libx264 @ 00000253366702c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 9% 48% 15% 4% 5% 4% 7% 3% 5%
[libx264 @ 00000253366702c0] i8c dc,h,v,p: 61% 19% 16% 4%
[libx264 @ 00000253366702c0] Weighted P-Frames: Y:3.5% UV:1.3%
[libx264 @ 00000253366702c0] ref P L0: 55.4% 15.5% 20.6% 8.2% 0.3%
[libx264 @ 00000253366702c0] ref B L0: 89.3% 8.2% 2.5%
[libx264 @ 00000253366702c0] ref B L1: 95.5% 4.5%
[libx264 @ 00000253366702c0] kb/s:930.17
[aac @ 00000253382c31c0] Qavg: 65536.000



Could someone point me in the right direction please ? I've tried doing the conversion with Handbrake as well and the audio is still choppy.