
Recherche avancée
Médias (1)
-
Video d’abeille en portrait
14 mai 2011, par
Mis à jour : Février 2012
Langue : français
Type : Video
Autres articles (95)
-
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 -
HTML5 audio and video support
13 avril 2011, parMediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
For older browsers the Flowplayer flash fallback is used.
MediaSPIP allows for media playback on major mobile platforms with the above (...) -
Support audio et vidéo HTML5
10 avril 2011MediaSPIP utilise les balises HTML5 video et audio pour la lecture de documents multimedia en profitant des dernières innovations du W3C supportées par les navigateurs modernes.
Pour les navigateurs plus anciens, le lecteur flash Flowplayer est utilisé.
Le lecteur HTML5 utilisé a été spécifiquement créé pour MediaSPIP : il est complètement modifiable graphiquement pour correspondre à un thème choisi.
Ces technologies permettent de distribuer vidéo et son à la fois sur des ordinateurs conventionnels (...)
Sur d’autres sites (10302)
-
Uploading video to Twitter sometimes doesn't work
22 juillet 2021, par K-s S-kI have a very difficult situation. I've already spent 2 days and couldn't find a solution. Project on Laravel. I want to upload videos to Twitter using the Twitter API endpoints. But sometimes I am getting this error :




file is currently unsupported




I did everything as recommended in the official documentation Video specifications and recommendations. I get an error when I set an audio codec is aac in my video file, despite the fact that it is recommended in the official documentation, but when I set the audio codec to mp3, the video is uploaded, but the sound quality is very poor, and sometimes there is no sound at all. Please forgive me if this is awkward to read, but I want to provide all of my code. Because I don't know how to solve this anymore and I think it might help.


<?php

namespace App\Jobs;

use App\Models\PublishedContent;
use Atymic\Twitter\Facades\Twitter;
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\File;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Str;


class PublishToTwitter implements ShouldQueue
{
 use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

 /**
 * @var
 */
 protected $publishingData;

 /**
 * Create a new job instance.
 *
 * @param $publishingData
 */
 public function __construct($publishingData)
 {
 $this->publishingData = $publishingData;
 }

 /**
 * Execute the job.
 *
 * @return void
 */
 public function handle()
 {
 $publishingData = $this->publishingData;

 if (is_array($publishingData)) {
 $publishingResult = $this->publishing(...array_values($publishingData));
 sendNotification($publishingResult['message'], $publishingResult['status'], 'Twitter', $publishingResult['link'], $publishingData['post_name'], $publishingData['user']);
 } else {
 $scheduledData = processingScheduledPost($publishingData);
 $postName = $scheduledData['scheduleData']['post_name'];
 $postContent = $scheduledData['scheduleData']['post_content'];
 $userToken = json_decode($publishingData->user_token,true);
 $requestToken = [
 'token' => $userToken['oauth_token'],
 'secret' => $userToken['oauth_token_secret'],
 ];
 $publishingResult = $this->publishing($scheduledData['file'], $postName, $postContent, $requestToken);
 $publishingResult['status'] && PublishedContent::add($scheduledData['craft'], $scheduledData['file'], "twitter_share");
 sendResultToUser($publishingData, $scheduledData['user'], $publishingResult['message'], $postName, $publishingResult['link'], $publishingResult['publishing_status'], $scheduledData['social_media']);
 sendNotification($publishingResult['message'], $publishingResult['status'], 'Twitter', $publishingResult['link'], $postName, $scheduledData['user']);
 }
 }

 /**
 * @param $file
 * @param $postName
 * @param $postContent
 * @param $requestToken
 * @return array
 */
 private function publishing($file, $postName, $postContent, $requestToken): array
 {
 $result = [
 'status' => false,
 'link' => null,
 'message' => 'Your content can\'t successfully published on Twitter. This file is not supported for publishing.',
 'publishing_status' => 'error'
 ];

 if ((($file->refe_type !== 'text') || $file->refe_file_path) && !checkIfFileExist($file->refe_file_path)) {
 $result['message'] = 'Missing or invalid file.';
 return $result;
 }

 $filePath = $file->refe_file_path;
 $fileSize = $file->content_length;
 $tempFileName = 'temp-' . $file->refe_file_name;
 $ext = $file->file_type;
 $mediaCategory = 'tweet_' . $file->refe_type;
 $mediaType = $file->refe_type . '/' . $ext;
 $remoteFile = file_get_contents($filePath);
 $tempFolder = public_path('/storage/uploads/temp');

 if (!file_exists($tempFolder)) {
 mkdir($tempFolder, 0777, true);
 }

 $tempFile = public_path('/storage/uploads/temp/' . $tempFileName);
 File::put($tempFile, $remoteFile);
 $convertedFileName = 'converted-' . $file->refe_file_name;
 $convertedFile = public_path('/storage/uploads/temp/' . $convertedFileName);
 $command = 'ffmpeg -y -i '.$tempFile.' -b:v 5000k -b:a 380k -c:a aac -profile:a aac_low -threads 1 '.$convertedFile.'';
 exec($command);
 @File::delete($tempFile);

 try {
 $twitter = Twitter::usingCredentials($requestToken['token'], $requestToken['secret']);
 if ($file->refe_type === 'text') {
 $twitter->postTweet([
 'status' => urldecode($postContent),
 'format' => 'json',
 ]);

 $result['link'] = 'https://twitter.com/home';
 $result['status'] = true;
 $result['message'] = 'Your content successfully published on Twitter. You can visit to Twitter and check it.';
 $result['publishing_status'] = 'done';
 } else if ($file->refe_type === 'video' || $file->refe_type === 'image') {
 if ($file->refe_type === 'video') {
 $duration = getVideoDuration($file->refe_file_path);

 if ($duration > config('constant.sharing_configs.max_video_duration.twitter')) {
 throw new \Exception('The duration of the video file must not exceed 140 seconds.');
 }
 }

 $isFileTypeSupported = checkPublishedFileType('twitter', $file->refe_type, strtolower($ext));
 $isFileSizeSupported = checkPublishedFileSize('twitter', $file->refe_type, $fileSize, strtolower($ext));

 if (!$isFileTypeSupported) {
 throw new \Exception('Your content can\'t successfully published on Twitter. This file type is not supported for publishing.');
 }

 if (!$isFileSizeSupported) {
 throw new \Exception('Your content can\'t successfully published on Twitter. The file size is exceeded.');
 }

 if ($file->refe_type === 'video') $fileSize = filesize($convertedFile);

 if (strtolower($ext) === 'gif') {
 $initMedia = $twitter->uploadMedia([
 'command' => 'INIT',
 'total_bytes' => (int)$fileSize
 ]);
 } else {
 $initMedia = $twitter->uploadMedia([
 'command' => 'INIT',
 'media_type' => $mediaType,
 'media_category' => $mediaCategory,
 'total_bytes' => (int)$fileSize
 ]);
 }

 $mediaId = (int)$initMedia->media_id_string;

 $fp = fopen($convertedFile, 'r');
 $segmentId = 0;

 while (!feof($fp)) {
 $chunk = fread($fp, 1048576);

 $twitter->uploadMedia([
 'media_data' => base64_encode($chunk),
 'command' => 'APPEND',
 'segment_index' => $segmentId,
 'media_id' => $mediaId
 ]);

 $segmentId++;
 }

 fclose($fp);

 $twitter->uploadMedia([
 'command' => 'FINALIZE',
 'media_id' => $mediaId
 ]);

 if ($file->refe_type === 'video') {
 $waits = 0;

 while ($waits <= 4) {
 // Authorizing header for Twitter API
 $oauth = [
 'command' => 'STATUS',
 'media_id' => $mediaId,
 'oauth_consumer_key' => config('twitter.consumer_key'),
 'oauth_nonce' => Str::random(42),
 'oauth_signature_method' => 'HMAC-SHA1',
 'oauth_timestamp' => time(),
 'oauth_token' => $requestToken['token'],
 'oauth_version' => '1.0'
 ];

 // Generate an OAuth 1.0a HMAC-SHA1 signature for an HTTP request
 $baseInfo = $this->buildBaseString('https://upload.twitter.com/1.1/media/upload.json', 'GET', $oauth);
 // Getting a signing key
 $compositeKey = rawurlencode(config('twitter.consumer_secret')) . '&' . rawurlencode($requestToken['secret']);
 // Calculating the signature
 $oauthSignature = base64_encode(hash_hmac('sha1', $baseInfo, $compositeKey, true));
 $oauth['oauth_signature'] = $oauthSignature;
 $headers['Authorization'] = $this->buildAuthorizationHeader($oauth);

 try {
 $guzzle = new GuzzleClient([
 'headers' => $headers
 ]);
 $response = $guzzle->request( 'GET', 'https://upload.twitter.com/1.1/media/upload.json?command=STATUS&media_id=' . $mediaId);
 $uploadStatus = json_decode($response->getBody()->getContents());
 } catch (\Exception | GuzzleException $e) {
 dd($e->getMessage(), $e->getLine(), $e->getFile());
 }

 if (isset($uploadStatus->processing_info->state)) {
 switch ($uploadStatus->processing_info->state) {
 case 'succeeded':
 $waits = 5; // break out of the while loop
 break;
 case 'failed':
 File::delete($tempFile);
 Log::error('File processing failed: ' . $uploadStatus->processing_info->error->message);
 throw new \Exception('File processing failed: ' . $uploadStatus->processing_info->error->message);
 default:
 sleep($uploadStatus->processing_info->check_after_secs);
 $waits++;
 }
 } else {
 throw new \Exception('There was an unknown error uploading your file');
 }
 }
 }

 $twitter->postTweet(['status' => urldecode($postContent), 'media_ids' => $initMedia->media_id_string]);
 @File::delete($convertedFile);
 $result['link'] = 'https://twitter.com/home';
 $result['status'] = true;
 $result['message'] = 'Your content successfully published on Twitter. You can visit to Twitter and check it.';
 $result['publishing_status'] = 'done';
 }
 } catch (\Exception $e) {
 dd($e->getMessage());
 $result['message'] = $e->getMessage();
 return $result;
 }

 return $result;
 }

 /**
 * @param $baseURI
 * @param $method
 * @param $params
 * @return string
 *
 * Creating the signature base string
 */
 protected function buildBaseString($baseURI, $method, $params): string
 {
 $r = array();
 ksort($params);
 foreach($params as $key=>$value){
 $r[] = "$key=" . rawurlencode($value);
 }
 return $method . "&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
 }

 /**
 * @param $oauth
 * @return string
 *
 * Collecting parameters
 */
 protected function buildAuthorizationHeader($oauth): string
 {
 $r = 'OAuth ';
 $values = array();
 foreach($oauth as $key=>$value)
 $values[] = "$key=\"" . rawurlencode($value) . "\"";
 $r .= implode(', ', $values);
 return $r;
 }
}




I would be very grateful if someone would help me.


-
Why FFmpeg transcode with strips
15 septembre 2023, par Андрей ТернитиI have MJPEG video. I want get VP9 webm video.


ffmpeg -loglevel verbose -i "input.yuvj422p" -pix_fmt yuv420p -c:v libvpx-vp9 -crf 20 -b:v 0 constantQualityExample.webm



And it works ok (right image), log :


[mjpeg @ 0x55b9b4b7ea40] Format mjpeg detected only with low score of 25, misdetection possible!
Input #0, mjpeg, from 'input.yuvj422p':
 Duration: N/A, bitrate: N/A
 Stream #0:0: Video: mjpeg (Baseline), 1 reference frame, yuvj422p(pc, bt470bg/unknown/unknown, center), 1280x720 [SAR 1:1 DAR 16:9], 25 tbr, 1200k tbn, 25 tbc
Stream mapping:
 Stream #0:0 -> #0:0 (mjpeg (native) -> vp9 (libvpx-vp9))
Press [q] to stop, [?] for help
[graph 0 input from stream 0:0 @ 0x55b9b4ba4a00] w:1280 h:720 pixfmt:yuvj422p tb:1/1200000 fr:25/1 sar:1/1
[auto_scaler_0 @ 0x55b9b4ba7c00] w:iw h:ih flags:'bicubic' interl:0
[format @ 0x55b9b4ba5800] auto-inserting filter 'auto_scaler_0' between the filter 'Parsed_null_0' and the filter 'format'
[swscaler @ 0x55b9b4ba8b00] deprecated pixel format used, make sure you did set range correctly
[auto_scaler_0 @ 0x55b9b4ba7c00] w:1280 h:720 fmt:yuvj422p sar:1/1 -> w:1280 h:720 fmt:yuv420p sar:1/1 flags:0x4
[libvpx-vp9 @ 0x55b9b4b85840] v1.7.0
[libvpx-vp9 @ 0x55b9b4b85840] --prefix=/usr --enable-pic --enable-shared --disable-install-bins --disable-install-srcs --size-limit=16384x16384 --enable-postproc --enable-multi-res-encoding --enable-temporal-denoising --enable-vp9-temporal-denoising --enable-vp9-postproc --target=x86_64-linux-gcc
Output #0, webm, to 'constantQualityExample.webm':
 Metadata:
 encoder : Lavf58.45.100
 Stream #0:0: Video: vp9 (libvpx-vp9), 1 reference frame, yuv420p(center), 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 1k tbn, 25 tbc
 Metadata:
 encoder : Lavc58.91.100 libvpx-vp9
 Side data:
 cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
No more output streams to write to, finishing.
Automatically inserted bitstream filter 'vp9_superframe'; args=''



But I want the same by libav. I take official example and make a little changes to make code easy (remove audio capabilities, remove multi-video streams capabilities), my code here. But it produce video with strips and drop last frame (left image).


Mediainfo :


My example log :


Input #0, jpeg_pipe, from 'input.yuvj422p':
 Duration: N/A, bitrate: N/A
 Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn
[libvpx-vp9 @ 0x5593e186fa80] v1.11.0
Output #0, webm, to 'VideoOut.webm':
 Stream #0:0: Video: vp9, yuv420p(unknown/bt470bg/unknown), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 25 tbn
[swscaler @ 0x5593e221af00] deprecated pixel format used, make sure you did set range correctly



What I should change in my code to take ok result like ffmpeg ?


-
Mobile Analytics SDK : beta release of Piwik iOS SDK
30 octobre 2013, par Piwik teamMattias Levin, a Mobile developer enthusiast from Sweden, has released the first public beta version of the official Piwik SDK for iOS !
If you are building apps for iOS or OSX, you will be able to track your App usage with Piwik. Learn more in this blog post.
Apps & Mobile apps Analytics
Using Piwik to track your app usage would give interesting statistics usage such as :
- number of active users (per day, week, month, …) of my mobile or desktop app,
- how long users spend in the app,
- track which icons, buttons are clicked (or any other custom event),
- record device info, operating system,
- reports on any Custom Variables you that are relevant to your app (see examples below),
-
how often is the app opened ? When and how long is the app opened ?
- number of new users, active users, total users,
- record errors or exception thrown
Piwik SDK for iOS
The PiwikTracker is an Objective-C framework (for iOS and OSX) designed to send app usage data to a Piwik analytics server. It is realeased under MIT license. Piwik server is a downloadable, Free/Libre (GPLv3 licensed) real time analytics platform.
Getting started
- Create a new website in the Piwik web interface called “My App”. Copy the Website ID and the token_auth.
- Download the PiwikTracker SDK.
- Add the PiwikTracker files to your project.
- Create and configure the PiwikTracker.
- Add code in your app to track screen views, events, exceptions, goals and more
- Let the dispatch timer dispatch pending events to the Piwik server, or dispatch events manually.
For more info, check out the Readme.
Requirements
The latest PiwikTracker version uses ARC and support iOS6+ and OSX 10.7+.
- iOS tracker depends on : Core Data, Core Location, Core Graphics, UIKit and AFNetworking.
- OSX tracker depends on : Core Data, Core Graphics, Cocoa and AFNetworking.
Demo project
The workspace contains an iPhone demo app that uses and demonstrates the features available in the SDK.
Feedback needed
If you use the iOS SDK to track your app, we would like to hear your suggestions, bug reports or general feedback.
We hope to work with you to improve the SDK and move it out of beta !
Please report suggestions, bugs, feature requests in the Github Issues at Piwik iOS SDK.
Happy App Analytics !