Giter Club home page Giter Club logo

hotdogseagull's Introduction

HOTDOGSEAGULL

This is a server built in node.js that lets you browse your media using a browser and push it up to a chromecast. Should be suitable for running on a home server.

This is intended as a starting point for UNIX inclined people to set up local media servers for the chromecast. The UI intentionally looks bad because I want to leave the UI to others while I focus on the technical aspects. If you make any improvements to this code, feel free to send a pull request. See below for more details on future development

Tested on OS X but should work on anything that can run node and ffmpeg.

Verified to work even on a Raspberry Pi when files are fully compatible (i.e. no transcoding needs to be done).

Features

  • Uses the default media player app on the Chromecast - no need to get a developer ID or publish an app.
  • Detects which of your local files are fully compatible with the chromecast using ffmpeg
  • Transcoding that only re-encodes the streams that need it. (I.e. audio/video that is already compatible will not be transcoded.).
  • External and Internal subtitles (ass,srt) and audio/video track selection when using transcoding.
  • Extremely basic UI. Uses templates so adding skins and customizing should be easier.
  • API so you can use transcoding and compatibility checking in your own app! (See below)
  • Lets you try files anyways just in case detection got it wrong. (Let me know when detection is wrong).
  • Lots of debugging output
  • Ridiculous name

Installation

Depends on ffmpeg and ffprobe (provided by ffmpeg). You can install this using Homebrew or whatever package manager you have on your system. If you have issues with transcoding, check the ffmpeg configuration section for the flags you need.

Depends on node packages: express, dot, node-ffprobe, fluent-ffmpeg

git clone https://github.com/craiig/HOTDOGSEAGULL
cd HOTDOGSEAGULL
brew install ffmpeg --with-libass --enable-libx264
npm install
cp config.sample.json config.json
edit 'media_folder' variable in config.json to point to your media directory
node server.js
Visit http://<local_ip>:3000 in a web browser.

NOTE: You need to use an ip that the chromecast can access. I.e. use 192.168.1.X and don't use localhost.

FFmpeg configuration

I've tested this with ffmpeg 1.2.4. If you are having issues with transcoding, particularly subs, you should ensure your ffmpeg version has been compiled with the following flags: --enable-libass --enable-libx264. Run ffmpeg -version to see what options it has been built with.

OS X Users: Homebrew does not include the subtitle library by default. Install ffmpeg with the following command: brew install ffmpeg --with-libass --enable-libx264

Leave me a note if you have to recompile ffmpeg for your system and I'll make a note here for others.

Known Issues

As of Feb 24 2014:

  • The Chromecast default media player doesn't seem to update the sender on the progress through the video. Manual status changes, such as pausing, muting, etc will cause the progress to get updated. This is also an issue in Google's CastHelloVideo, so I'm not sure if it's just not currently possible or I'm not adding a listener in the right places.
  • Skipping while transcoding is not supported. I'm looking into ways to make this work.

Warranty & Support

This server might be very insecure and may leak all your files. Security audits/fixes are more than welcome. For the love of god put this behind a firewall.

Make posts in the github issue tracker if you have problems.

Upcoming features & Contributing

To contribute, just send a pull request on github and I'll look at it. Bugs, new features, better UI, it's all welcome but I don't guarantee I'll accept everything.

Here are some features that would be good to add:

  • Better UI layout
  • Read thumbnail from the video using ffmpeg
  • Skin & config system so you can switch between skins, etc.
  • UI & support for mobile browsers
  • Packaging this up for less technical users on other systems.

Here's what I'm working on:

  • Improving the player interaction with the chromecast
  • Play whole directory (gimme dat binge)
  • DLNA support (if possible)
  • Offline transcoding support

API

This module supports a basic API so that you can add compatibility checking and transcoding to your own node programs. Please feel free to give me some feedback on what you'd like to see from an API. Ideally many people can use this to get the server-side media features for the chromecast. I'm also looking into ways of supporting the javascript needed for the chromecast as well.

npm install https://github.com/craiig/HOTDOGSEAGULL/archive/master.tar.gz
chromecast = require('HOTDOGSEAGULL')
filename = ...

//retrieve chromecast compatibility information
chromecast.get_file_data(filename,
	function(compatible, compat_data){
		if(compatible){
			console.log("File is fully compatible");
		} else {
			console.log("File needs some transcoding");
		}
		console.log(compat_data);	
	});

//set up a route that transcodes the files
//note: make sure to set up a static route so you can serve files that are fully compatible
app.get('/transcode', function(req, res) {
	filename = ...
	options = {}; //list of options for transcoding, see the source for more details
	ffmpeg_flags = ""; //pass flags directly to ffmpeg
	chromecast.transcode_stream(filename, res, options, "", 
	  function(err, ffmpeg_error_code, ffmpeg_output){
		if(err){
			console.log("transcode error:");
			console.log(ffmpeg_output);
		} else {
			console.log("transcoding finished ffmpeg_output: ");
			console.log(ffmpeg_output);
		}
	});
 
});

License

I used some code from Google's CastHelloVideo-chrome which are under the Apache 2.0 License. https://github.com/googlecast/CastHelloVideo-chrome

You should consider my code to be under the Apache 2.0 license but with an ADDED REQUIREMENT THAT YOU MUST EXPLICITLY MENTION THIS RIDICULOUS PROJECT NAME (HOTDOGSEAGULL) IN YOUR ACCOMPANYING DOCUMENTATION.

hotdogseagull's People

Contributors

0xr avatar craiig avatar maakuth avatar mr-c avatar rhaamo avatar rylab avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hotdogseagull's Issues

Seeking while transcoding

You cannot enable seeking on live-transcoded media, this is just a limitation on how seeking works.

What you can do is fake it: add a seek parameter to your transcoding endpoints and pass "-ss seek" to ffmpeg. This implies loading a new media in the cast session every time you seek, but I haven't found a better solution yet.

Play from remote url

Hi,
i've successfully installed the media server. It is cool! But my question is...is possible to play media from a remote url? I've video stored into an another server, but i want for its chromecast streaming capabilities.
The remote server is AKAMAI..and for me is not possible to install HOTDOGSEAGULL on this.

Thanks and best Regards

More verbose error output

Is there a way to see more verbose error output? I have an AVI file where the audio and video are apparently both compatible with the Chromecast, but the container is not, so I transcode. It plays for about half a second before stopping, but the only output I see is:

192.168.1.2 - - [Mon, 09 Jun 2014 03:18:33 GMT] "GET /transcode?f=/foo.avi&audiotrack=0&videotrack=0&subtitles=&subtitletrack= HTTP/1.1" 200 - "-" "Mozilla/5.0 (CrKey armv7l 1.6.16664) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.0 Safari/537.36"
transcoding finished ffmpeg_output: 
[Error: ffmpeg exited with code 1]

I'd like to figure out why ffmpeg is throwing the error.

Transcoding Presets for different hardware

Would be nice for users with less PC horsepower to be able to adjust transcoding parameters. Perhaps a few presets that can be selected from. Maybe presets for different resolutions or borrowing the presets from handbrake.

ffmpeg unrecognized option

I get an error from ffmpeg:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: ffmpeg exited with code 1: Unrecognized option 'vcodec libx264 -profile:v high -level 5.0'.
Error splitting the argument list: Option not found

I did a wrapper that shows me how exactly ffmpeg gets called, and the command works when I invoke it from the command line. I've tried with multiple versions of ffmpeg and with the newest npm packages. The ffmpeg command is:

ffmpeg -i filename -f matroska -strict experimental -map v:0 -vcodec libx264 -profile:v high -level 5.0 -map a:0 -acodec aac -q:a 100 pipe:1

Any ideas? My platform is Debian Wheezy amd64 with ffmpeg 2.5.3 static build.

Exception upon selecting a file

When I click on a file link in the web interface or visit the "playfile?f=" direct link, the server fails with the following error:

192.168.1.4 - - [Thu, 13 Feb 2014 05:21:20 GMT] "GET / HTTP/1.1" 200 2990 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36"

events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:988:11)
at Process.ChildProcess._handle.onexit (child_process.js:779:34)

If it helps, the video file is in a mkv container. The video is encoded in H264 and the audio is AC3.

Possibility of supporting files with multiple audio tracks

Not sure if this is possible but here it goes.

Would be great to support files with multiple audio tracks. (Might require transcoding)

Here's the output of a file that has a Japanese main track and an English secondary. (It says not supported but the file plays fine since h.264)

File compatibility information

Compatibility guess: Won't work.
Container compatible: yes
Video compatible: no
Audio compatible: yes

Full Compatibility Debugging Data:
{ audio: 1,
video: 0,
container: 1,
ffprobe_data:
{ filename: 'Goldenboy-01.mkv',
filepath: '/mnt/torrents/GoldenBoy',
fileext: '.mkv',
file: '/mnt/torrents/GoldenBoy/Goldenboy-01.mkv',
probe_time: 332,
streams:
[ { codec_name: 'h264',
codec_long_name: 'H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10',
profile: 'High',
codec_type: 'video',
codec_time_base: '1001/60000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
width: 720,
height: 480,
has_b_frames: 2,
sample_aspect_ratio: '1:1',
display_aspect_ratio: '3:2',
pix_fmt: 'yuv420p',
level: 51,
timecode: 'N/A',
id: 'N/A',
r_frame_rate: '30000/1001',
avg_frame_rate: '30000/1001',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 1,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'jpn',
'TAG:title': 'Video' },
{ codec_name: 'aac',
codec_long_name: 'AAC (Advanced Audio Coding)',
profile: 'unknown',
codec_type: 'audio',
codec_time_base: '1/48000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
sample_fmt: 'fltp',
sample_rate: 48000,
channels: 2,
channel_layout: 'stereo',
bits_per_sample: 0,
id: 'N/A',
r_frame_rate: '0/0',
avg_frame_rate: '0/0',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 1,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'jpn',
'TAG:title': 'Japanese' },
{ codec_name: 'aac',
codec_long_name: 'AAC (Advanced Audio Coding)',
profile: 'unknown',
codec_type: 'audio',
codec_time_base: '1/48000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
sample_fmt: 'fltp',
sample_rate: 48000,
channels: 2,
channel_layout: 'stereo',
bits_per_sample: 0,
id: 'N/A',
r_frame_rate: '0/0',
avg_frame_rate: '0/0',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 0,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'eng',
'TAG:title': 'English' },
{ codec_name: 'subrip',
codec_long_name: 'SubRip subtitle',
profile: 'unknown',
codec_type: 'subtitle',
codec_time_base: '1/1000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
width: 'N/A',
height: 'N/A',
id: 'N/A',
r_frame_rate: '0/0',
avg_frame_rate: '0/0',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 1,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'eng' } ],
format:
{ nb_streams: 4,
nb_programs: 0,
format_name: 'matroska,webm',
format_long_name: 'Matroska / WebM',
start_time: 0,
duration: 1734.315,
size: 320532725,
bit_rate: 1478544,
probe_score: 100 },
metadata: { creation_time: '2007-08-07 22:54:55' } },
video_transcode: '-vcodec libx264 -profile:v high -level 5.0',
audio_transcode: '-acodec copy',
transcode_cmd: 'ffmpeg -i "Goldenboy-01.mkv" -vcodec libx264 -profile:v high -level 5.0 -acodec copy "Goldenboy-01.mp4"' }

And here's what VLC reports if it helps at all.

screen

Errors out upon launch

I messed something up so I did a fresh install of node and HOTDOGSEGULL.

Whenever I run node server.js it just sits there for a few seconds then spits out

pi@raspberrypi ~/build/HOTDOGSEAGULL $ node server.js

events.js:72
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE
at errnoException (net.js:901:11)
at Server._listen2 (net.js:1039:14)
at listen (net.js:1061:10)
at Server.listen (net.js:1135:5)
at Function.app.listen (/home/pi/build/HOTDOGSEAGULL/node_modules/express/lib/application.js:533:24)
at Object. (/home/pi/build/HOTDOGSEAGULL/server.js:88:5)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)

EDIT: Ok now I see where it says address is in use, but the program isn't running at all and nothing is using 3000

Not accepting the set media_folder

Posted this as a comment to the reddit post but figured it might be better here.

The only thing I changed was the media_folder to /mnt/torrents and I get this error

TypeError: Arguments to path.join must be strings
at path.js:360:15
at Array.filter (native)
at Object.exports.join (path.js:358:36)
at append_compat (/home/pi/build/HOTDOGSEAGULL/chromecast.js:131:24)
at Object.read_dir (/home/pi/build/HOTDOGSEAGULL/chromecast.js:143:2)
at /home/pi/build/HOTDOGSEAGULL/server.js:31:13
at callbacks (/home/pi/build/HOTDOGSEAGULL/node_modules/express/lib/router/index.js:164:37)
at param (/home/pi/build/HOTDOGSEAGULL/node_modules/express/lib/router/index.js:138:11)
at pass (/home/pi/build/HOTDOGSEAGULL/node_modules/express/lib/router/index.js:145:5)
at Router._dispatch (/home/pi/build/HOTDOGSEAGULL/node_modules/express/lib/router/index.js:173:5)

Installing to whole system using npm install

From parkerlreed on reddit:

"I lied :< It only worked because I was still running it from the git directory. Launching it outside of the git directory fails.
checking compatbility: basedir: /mnt/torrents file: /Oney Videos - Pointy Bits - FF7 Parody-pDqea9cWOn4.mp4 Error: Failed to lookup view "index.html" in views directory "/home/pi/views" at Function.app.render (/usr/local/lib/node_modules/HOTDOGSEAGULL/node_modules/express/lib/application.js:493:17) at ServerResponse.res.render (/usr/local/lib/node_modules/HOTDOGSEAGULL/node_modules/express/lib/response.js:798:7) at /usr/local/lib/node_modules/HOTDOGSEAGULL/server.js:34:7 at /usr/local/lib/node_modules/HOTDOGSEAGULL/chromecast.js:150:6 at /usr/local/lib/node_modules/HOTDOGSEAGULL/chromecast.js:109:3 at append_probe_cache (/usr/local/lib/node_modules/HOTDOGSEAGULL/chromecast.js:35:5) at ChildProcess. (/usr/local/lib/node_modules/HOTDOGSEAGULL/node_modules/node-ffprobe/lib/ffprobe.js:110:4) at ChildProcess.EventEmitter.emit (events.js:98:17) at maybeClose (child_process.js:743:16) at Socket. (child_process.js:956:11) 192.168.1.114 - - [Tue, 11 Feb 2014 07:11:12 GMT] "GET / HTTP/1.1" 500 913 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36""

Gotta look into the right way to access files from an installed node app.

File names with apostrophes fail to load

Tried on three files with apostrophes and all fail to load.

"init success"
"receiver found"
"New session ID:CEC0B81E-771B-042C-4E01-516A77090175"
"Found 1 existing media sessions."
"new media session ID:4 (onRequestSessionSuccess_)"
"Session stopped"
"session success: 25333233-AACE-5DE7-B5A5-2C18EE01551F"
"loading..."
"media error: code: session_error description: LOAD_FAILED details: null"

Compatibility guess: Should work.
Container compatible: yes
Video compatible: yes
Audio compatible: yes

Full Compatibility Debugging Data:
{ audio: 1,
video: 1,
container: 1,
ffprobe_data:
{ filename: '[a-s]demon_king_daimao-10-akuto's_great_capital_war__rs2[1080p_bd-rip][50A4A69C].mkv',
filepath: '/mnt/torrents/Demon.King.Daimao.S01.1080p.BluRay.x264-AnimeSupreme',
fileext: '.mkv',
file: '/mnt/torrents/Demon.King.Daimao.S01.1080p.BluRay.x264-AnimeSupreme/[a-s]demon_king_daimao-10-akuto's_great_capital_war__rs2[1080p_bd-rip][50A4A69C].mkv',
probe_time: 476,
streams:
[ { codec_name: 'h264',
codec_long_name: 'H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10',
profile: 'High',
codec_type: 'video',
codec_time_base: '1001/48000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
width: 1920,
height: 1080,
has_b_frames: 2,
sample_aspect_ratio: '1:1',
display_aspect_ratio: '16:9',
pix_fmt: 'yuv420p',
level: 50,
timecode: 'N/A',
id: 'N/A',
r_frame_rate: '24000/1001',
avg_frame_rate: '24000/1001',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 1,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'jpn',
'TAG:title': 'AVC-HD' },
{ codec_name: 'aac',
codec_long_name: 'AAC (Advanced Audio Coding)',
profile: 'unknown',
codec_type: 'audio',
codec_time_base: '1/48000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
sample_fmt: 'fltp',
sample_rate: 48000,
channels: 2,
channel_layout: 'stereo',
bits_per_sample: 0,
id: 'N/A',
r_frame_rate: '0/0',
avg_frame_rate: '0/0',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 1,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'eng',
'TAG:title': 'AAC' },
{ codec_name: 'aac',
codec_long_name: 'AAC (Advanced Audio Coding)',
profile: 'unknown',
codec_type: 'audio',
codec_time_base: '1/48000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
sample_fmt: 'fltp',
sample_rate: 48000,
channels: 2,
channel_layout: 'stereo',
bits_per_sample: 0,
id: 'N/A',
r_frame_rate: '0/0',
avg_frame_rate: '0/0',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 0,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'jpn',
'TAG:title': 'AAC' },
{ codec_name: 'ssa',
codec_long_name: 'SSA (SubStation Alpha) subtitle',
profile: 'unknown',
codec_type: 'subtitle',
codec_time_base: '1/1000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
width: 'N/A',
height: 'N/A',
id: 'N/A',
r_frame_rate: '0/0',
avg_frame_rate: '0/0',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 1,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'eng',
'TAG:title': 'ASS' },
{ codec_name: 'ssa',
codec_long_name: 'SSA (SubStation Alpha) subtitle',
profile: 'unknown',
codec_type: 'subtitle',
codec_time_base: '1/1000',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
width: 'N/A',
height: 'N/A',
id: 'N/A',
r_frame_rate: '0/0',
avg_frame_rate: '0/0',
time_base: '1/1000',
start_pts: 0,
start_time: 0,
duration_ts: 'N/A',
duration: 'N/A',
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 0,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:language': 'jpn',
'TAG:title': 'ASS' },
{ codec_name: 'unknown',
codec_long_name: 'unknown',
profile: 'unknown',
codec_type: 'attachment',
codec_time_base: '0/1',
codec_tag_string: '[0][0][0][0]',
codec_tag: '0x0000',
id: 'N/A',
r_frame_rate: '0/0',
avg_frame_rate: '0/0',
time_base: '1/90000',
start_pts: 0,
start_time: 0,
duration_ts: 128083230,
duration: 1423.147,
bit_rate: 'N/A',
nb_frames: 'N/A',
nb_read_frames: 'N/A',
nb_read_packets: 'N/A',
'DISPOSITION:default': 0,
'DISPOSITION:dub': 0,
'DISPOSITION:original': 0,
'DISPOSITION:comment': 0,
'DISPOSITION:lyrics': 0,
'DISPOSITION:karaoke': 0,
'DISPOSITION:forced': 0,
'DISPOSITION:hearing_impaired': 0,
'DISPOSITION:visual_impaired': 0,
'DISPOSITION:clean_effects': 0,
'DISPOSITION:attached_pic': 0,
'TAG:filename': 'BAARS___.TTF',
'TAG:mimetype': 'application/x-truetype-font' } ],
format:
{ nb_streams: 6,
nb_programs: 0,
format_name: 'matroska,webm',
format_long_name: 'Matroska / WebM',
start_time: 0,
duration: 1423.147,
size: 802095361,
bit_rate: 4508854,
probe_score: 100 },
metadata: { creation_time: '2011-07-03 23:32:32' } } }

Seeking doesn't work when transcoding

Seeking through a video using the "Progress" slider doesn't seem to work when a file is being transcoded. I'm using an MKV file with H264 video and AC3 audio. I know that AC3 isn't a supported audio codec, but I can load and play the file as-is and get video without audio. The slider works in this case. When I choose to transcode, the video gets passed through and the audio gets transcoded. I get both video and audio on the other end, but the slider ceases to work. It will still print "media seek done" to the textarea and the state will change to "BUFFERING" for a moment, but the video continues to play without even pausing. The pause button still works.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.